Scenario Scope
What is Scope?
In Vedro, the Scope serves as a snapshot of important variables, capturing their current states when a test scenario fails. This snapshot offers valuable insights into the execution environment, making it highly useful for debugging and understanding the cause of the test failure.
A Practical Example
To better understand how the Scope works, consider the following real-world example.
Imagine a scenario that tests sending a chat message. The process begins with a logged-in user, sends a message via the ChatApi and then verifies that the received response meets expectations.
import vedro
from contexts import logged_in_user
from interfaces import ChatApi
class Scenario(vedro.Scenario):
subject = "send message"
def given_user_token(self):
self.token = logged_in_user()
def given_message(self):
self.message = "banana"
def when_user_sends_message(self):
self.response = ChatApi().send(self.message, self.token["token"])
def then_it_should_return_success_response(self):
assert self.response.status_code == 200
def and_it_should_return_sent_message(self):
assert self.response.json() == {
"username": self.token["username"],
"text": self.message,
}
In this scenario, the variables token
, message
, and response
are critical to the test's success. They are stored as instance variables within the Scenario class:
- token: Retains the user's token details
- message: Holds the chat message to be sent
- response: Captures the server's reply
What Happens When a Test Fails?
When you run the command with verbose output (-v
) and a test scenario fails, a snapshot of key variables at that specific moment is captured and displayed as the Scope, alongside the exception.
$ vedro run -v
Exception:
╭────────────────────── Traceback (most recent call last) ───────────────────────╮
│ ./scenarios/send_message/send_message.py:28 │
│ 26 │ │
│ 27 │ def and_it_should_return_sent_message(self): │
│ ❱ 28 │ │ assert self.response.json() == MessageSchema % { │
│ 29 │ │ │ "username": self.token["username"], │
│ 30 │ │ │ "text": self.message["text"], │
│ 31 │ │ } │
╰────────────────────────────────────────────────────────────────────────────────╯
ValidationException:
- Value <class 'str'> at _['text'] must be equal to 'banana', but '0RLyemKwG53' given
Scope:
Scope
token: {
"username": "vzwmkast",
"token": "0f8fefc25185eb869fd5acbe6b6778523d6172b7",
"created_at": 1694250002
}
message: {
"text": "0RLyemKwG53",
"chat_id": "Cuyjp"
}
response: Response:
HTTP/1.1 200 OK
content-type: application/json; charset=utf-8
content-encoding: gzip
{
│ "username": "vzwmkast",
│ "text": "banana",
│ "sent_at": 1694250002
}
Benefits of Using Scope
-
Debugging Made Easier: With Scope, debugging becomes more straightforward. You receive an immediate snapshot of crucial variables at the moment of failure. This eliminates guesswork and accelerates the troubleshooting process.
-
Replicating Errors: Encountering an error once is challenging, but consistently reproducing it is even more so. The Scope output serves as a valuable tool, significantly simplifying the recreation of the error for more detailed testing and analysis.
-
Team Communication: Collaborative debugging can be complicated without the right information. Sharing a snapshot of the Scope when a test fails gives team members a clearer picture of the situation, streamlining both communication and resolution.