Вы действительно знаете, как писать утверждения автоматизированных тестов?
При тестировании интерфейса утверждение — очень важная операция. Это средство проверки того, соответствуют ли результаты, возвращаемые интерфейсом, ожиданиям. Вообще говоря, утверждения теста интерфейса можно грубо разделить на следующие категории:
Этот метод использования утверждений для тестирования интерфейса может иметь разные реализации в среде тестирования.
Ниже в качестве простого примера будет использоваться модуль запросов Python.
Во-первых, нам нужно создать базовый запрос GET и получить ответ:
import requests
response = requests.get('http://api.example.com/data')
После получения ответа мы можем использовать ключевое слово Python для подтверждения. Например, мы можем утверждать, что код состояния — 200:
assert response.status_code == 200
assert response.status_code == 200
Если код состояния не 200,Тогда этот оператор выкинетAssertionError
。
Мы также можем утверждать, что данные JSON ответа содержат определенный ключ:
data = response.json()
assert 'key' in data
Аналогично, если «ключ» отсутствует в данных, этот оператор также выдаст ошибку AssertionError. Для более сложных утверждений нам может потребоваться использовать некоторые сторонние библиотеки. Например, мы можем использовать библиотеку jsonschema, чтобы подтвердить, что данные ответа соответствуют определенной схеме JSON:
from jsonschema import validate
schema = {
"type" : "object",
"properties" : {
"key" : {"type" : "string"},
},
"required": ["key"]
}
validate(data, schema)
Так что же нам делать с более сложными утверждениями?
Для утверждений ответа JSON в основном необходимо подтвердить, соответствуют ли один или несколько элементов в возвращаемом объекте JSON ожиданиям. Самый распространенный способ доказать это — сравнить пары ключ-значение, чтобы увидеть, совпадают ли они. Например, предположим, что ожидаемый нами ответ JSON выглядит следующим образом:
{
"title": "foo",
"body": "bar",
"userId": 1
}
Мы можем использовать Python для выполнения простой операции утверждения:
expected_json = {
"title": "foo",
"body": "bar",
"userId": 1
}
response_json = response.json()
assert response_json == expected_json
В приведенном выше коде функция response.json() используется для получения данных JSON из ответа, а затем с помощью оператора Assert проверяется, совпадают ли данные JSON с ожидаемыми данными JSON.
Если нас интересует только определенная часть возвращаемого результата, например, нас интересует только поле заголовка в возвращаемом результате, то мы можем сделать следующее утверждение:
assert response_json['title'] == expected_json['title']
assert response_json['title'] == expected_json['title']
Для более сложных утверждений ответа JSON, например, если ответ JSON представляет собой вложенную структуру или массив JSON, нам может потребоваться выполнить рекурсивные операции или операции обхода для создания утверждений. В этом случае мы можем использовать некоторые сторонние библиотеки утверждений. повысить нашу эффективность. Например, библиотека jsonpath Python может помочь нам быстро найти определенный фрагмент данных в JSON и сделать утверждения.
JsonPah — это язык поиска информации, который позволяет быстро найти часть структуры JSON, используя синтаксис, подобный XPath.Обработка вложенных структурJSONПри ответе,JsonPath предоставляет простой и эффективный метод. Важно понимать синтаксис JsonPath.,например '$' Представляет корневой узел, '.' или '[]' Используется для доступа к дочерним узлам, '*' Используется для подстановочных знаков и т. д.
Вот пример, иллюстрирующий использование JsonPath: Предположим, у нас есть сложный JSON следующим образом:
response_json = {
"store": {
"book": [
{
"category": "reference",
"author": "Nigel Rees",
"title": "Sayings of the Century",
"price": 8.95
},
{
"category": "fiction",
"author": "Evelyn Waugh",
"title": "Sword of Honour",
"price": 12.99
},
{
"category": "fiction",
"author": "Herman Melville",
"title": "Moby Dick",
"price": 8.99
},
{
"category": "fiction",
"author": "J. R. R. Tolkien",
"title": "The Lord of the Rings",
"price": 22.99
}
],
"bicycle": {
"color": "red",
"price": 19.95
}
},
}
Если нам нужно получить названия всех книг, мы можем использовать следующий оператор:
from jsonpath import jsonpathtitles = jsonpath(response_json, '$.store.book[*].title')print(titles) #Вывод: ['Высказывания of the Century', 'Sword of Honour', 'Moby Dick', 'The Lord of the Rings']
from jsonpath import jsonpath
titles = jsonpath(response_json, '$.store.book[*].title')
print(titles) #Вывод: ['Высказывания of the Century', 'Sword of Honour', 'Moby Dick', 'The Lord of the Rings']
Если нам нужно удалить названия книг с ценой больше 10, мы можем использовать следующий оператор:
titles = jsonpath(response_json, "$.store.book[?(@.price > 10)].title")print(titles) # Вывод: ['Меч of Honour', 'The Lord of the Rings']
titles = jsonpath(response_json, "$.store.book[?(@.price > 10)].title")
print(titles) # Вывод: ['Меч of Honour', 'The Lord of the Rings']
JsonPath очень краток и эффективен, что упрощает наши операции утверждения и делает код более понятным. Поскольку он очень мощный.
Не должно быть никакого способа использовать это
Не волнуйтесь, вот список часто используемых инструкций по синтаксическому анализу подстановочных знаков.
Подстановочные знаки в выражениях JsonPath обычно включают следующее:
Вышеупомянутые подстановочные знаки дают нам большую гибкость при использовании JsonPath, и мы можем точно найти нужный нам контент в большом или глубоко вложенном контенте JSON.
Итак, что же спросят на собеседовании?
Например:
интервьюер
:Скольким слоям путей может соответствовать оператор глубины в выражении JsonPath?
YOU
: в JsonPath оператор глубины .. Это очень полезно, когда людям, которые не знают точного пути, необходимо запросить многоуровневые вложенные файлы. .. Его не волнует точное положение элемента в данных JSON, он будет «глубоко искать», то есть независимо от того, насколько глубоко данные вложены в структуру JSON, он сможет найти их, если они соответствуют вашим условия запроса.
Можно использовать любое имяили ВОЗПодстановочный знак * При использовании с операторами глубины их комбинация может соответствовать элементам любого уровня. Например, предположим, что у нас есть объект JSON:
{
"level_1": {
"level_2": {
"level_3": {
"item": "value"
}
}
}
}
Если вы не знаете точный путь к «элементу», но знаете его имя и хотите найти его по данным JSON, вы можете использовать оператор .. и имя для выполнения глубокого поиска, например: $ ..item, это вернет все элементы с именем «item», независимо от того, на каком уровне они находятся.
В общем, оператор глубины .. может соответствовать бесконечному множеству уровней путей, что очень полезно для обработки глубоко вложенных структур данных.
интервьюер
:Помимо глубокого поиска, какие еще функции есть у JsonPath для обработки глубоко вложенных структур данных?
YO
: Помимо глубокого поиска, JsonPath также предоставляет некоторые другие функции для работы с глубоко вложенными структурами данных:
В общем, утверждения — важная часть тестирования интерфейса. Разумное и полное использование утверждений может не только улучшить качество нашего тестирования, но и помочь нам быстро обнаружить проблемы. В то же время формирование хорошей стратегии утверждения также особенно важно для поддержания и постоянного улучшения среды тестирования.
Если у вас есть какие-либо вопросы, пожалуйста, оставьте сообщение ниже ~