Вы действительно знаете, как писать утверждения автоматического тестирования интерфейса?
Вы действительно знаете, как писать утверждения автоматического тестирования интерфейса?

Вы действительно знаете, как писать утверждения автоматизированных тестов?

При тестировании интерфейса утверждение — очень важная операция. Это средство проверки того, соответствуют ли результаты, возвращаемые интерфейсом, ожиданиям. Вообще говоря, утверждения теста интерфейса можно грубо разделить на следующие категории:

  1. утверждение кода состояния:Это самый простой и часто используемый метод утверждения.。большую часть времени,Код состояния HTTP, возвращаемый интерфейсом, можно использовать для определения успешности запроса интерфейса.
  2. утверждение тела ответа:на основеинтерфейсответданные Выполнить проверку。
  3. утверждение времени ответа:интерфейс Находится ли время отклика в приемлемом диапазоне?。
  4. Утверждение базы данных:интерфейс После звонка,данные, есть ли соответствующие изменения.

Этот метод использования утверждений для тестирования интерфейса может иметь разные реализации в среде тестирования.

Ниже в качестве простого примера будет использоваться модуль запросов Python.

Во-первых, нам нужно создать базовый запрос GET и получить ответ:

Язык кода:javascript
копировать
import requests

response = requests.get('http://api.example.com/data')

После получения ответа мы можем использовать ключевое слово Python для подтверждения. Например, мы можем утверждать, что код состояния — 200:

Язык кода:javascript
копировать
assert response.status_code == 200
assert response.status_code == 200

Если код состояния не 200,Тогда этот оператор выкинетAssertionError

Мы также можем утверждать, что данные JSON ответа содержат определенный ключ:

Язык кода:javascript
копировать
data = response.json()
assert 'key' in data

Аналогично, если «ключ» отсутствует в данных, этот оператор также выдаст ошибку AssertionError. Для более сложных утверждений нам может потребоваться использовать некоторые сторонние библиотеки. Например, мы можем использовать библиотеку jsonschema, чтобы подтвердить, что данные ответа соответствуют определенной схеме JSON:

Язык кода:javascript
копировать
from jsonschema import validate

schema = {
    "type" : "object",
    "properties" : {
        "key" : {"type" : "string"},
    },
    "required": ["key"]
}

validate(data, schema)

Так что же нам делать с более сложными утверждениями?

Для утверждений ответа JSON в основном необходимо подтвердить, соответствуют ли один или несколько элементов в возвращаемом объекте JSON ожиданиям. Самый распространенный способ доказать это — сравнить пары ключ-значение, чтобы увидеть, совпадают ли они. Например, предположим, что ожидаемый нами ответ JSON выглядит следующим образом:

Язык кода:javascript
копировать
{
    "title": "foo",
    "body": "bar",
    "userId": 1
}

Мы можем использовать Python для выполнения простой операции утверждения:

Язык кода:javascript
копировать
expected_json = {
    "title": "foo",
    "body": "bar",
    "userId": 1
}

response_json = response.json()

assert response_json == expected_json

В приведенном выше коде функция response.json() используется для получения данных JSON из ответа, а затем с помощью оператора Assert проверяется, совпадают ли данные JSON с ожидаемыми данными JSON.

Если нас интересует только определенная часть возвращаемого результата, например, нас интересует только поле заголовка в возвращаемом результате, то мы можем сделать следующее утверждение:

Язык кода:javascript
копировать
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 следующим образом:

Язык кода:javascript
копировать
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
        }
    },
}

Если нам нужно получить названия всех книг, мы можем использовать следующий оператор:

Язык кода:javascript
копировать
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, мы можем использовать следующий оператор:

Язык кода:javascript
копировать
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 обычно включают следующее:

  1. *:Подстановочный знак,Соответствует всем объектам или элементам. Например, $..book[*].author Имена всех авторов.
  2. ..:оператор глубины,Независимо от того, сколько слоев глубоко,может соответствовать пути. Например, $..author Вся информация об авторе доступна.
  3. . или []:Перемещайтесь вниз слой за слоем,. Для имен [] Для имен с индексом или в количестве. например $['store']['book'][0]['price'] Узнайте цену своей первой книги.
  4. @:Текущая информация об узле,Часто используется в фильтрах.,например $..book[?(@.price<10)] Это означает получить все книги по цене меньше 10.
  5. ():группа выражений,Используется для фильтрации на основе пользовательских выражений. Например, $..book[(@.length-1)] Возьмите всю книгу.
  6. ?():оператор фильтра,Используется для поиска элементов, соответствующих критериям. Например, $..book[?(@.isbn)] Получите все книги, содержащие ISBN.

Вышеупомянутые подстановочные знаки дают нам большую гибкость при использовании JsonPath, и мы можем точно найти нужный нам контент в большом или глубоко вложенном контенте JSON.

Итак, что же спросят на собеседовании?

Например:

интервьюер

Скольким слоям путей может соответствовать оператор глубины в выражении JsonPath?

YOU

: в JsonPath оператор глубины .. Это очень полезно, когда людям, которые не знают точного пути, необходимо запросить многоуровневые вложенные файлы. .. Его не волнует точное положение элемента в данных JSON, он будет «глубоко искать», то есть независимо от того, насколько глубоко данные вложены в структуру JSON, он сможет найти их, если они соответствуют вашим условия запроса.

Можно использовать любое имяили ВОЗПодстановочный знак * При использовании с операторами глубины их комбинация может соответствовать элементам любого уровня. Например, предположим, что у нас есть объект JSON:

Язык кода:javascript
копировать
{
    "level_1": {
        "level_2": {
            "level_3": {
                "item": "value"
            }
        }
    }
}

Если вы не знаете точный путь к «элементу», но знаете его имя и хотите найти его по данным JSON, вы можете использовать оператор .. и имя для выполнения глубокого поиска, например: $ ..item, это вернет все элементы с именем «item», независимо от того, на каком уровне они находятся.

В общем, оператор глубины .. может соответствовать бесконечному множеству уровней путей, что очень полезно для обработки глубоко вложенных структур данных.

интервьюер

Помимо глубокого поиска, какие еще функции есть у JsonPath для обработки глубоко вложенных структур данных?

YO

: Помимо глубокого поиска, JsonPath также предоставляет некоторые другие функции для работы с глубоко вложенными структурами данных:

  1. Множество индексов: JsonPath позволяет использовать множество индексов для доступа к элементу в определенном месте. Например,Выражение $.store.book[0] вернет первую книгу из множества.
  2. Несколько индексов: JsonPath также позволяет вам получать доступ к нескольким элементам на одном уровне. Например, $.store.book[0,1] вернет первые две книги книги (множество).
  3. Операции нарезки: JsonPath поддерживает операции нарезки в стиле Python, позволяя получить доступ к непрерывной последовательности элементов, а не только к одному элементу. Например, $.store.book[1:3]верну книгимножество Вторая и третья книги。
  4. Выражения фильтра: JsonPath поддерживает выражения фильтра, позволяя использовать логические операторы и операторы сравнения для фильтрации возвращаемых элементов. Например, $.store.book[?(@.price < 10)] вернет все книги из множества книг по цене ниже 10.
  5. Подстановочный знак: Как мы обсуждали ранее, подстановочный знак * можно использовать для соответствия любому элементу, независимо от его позиции.

В общем, утверждения — важная часть тестирования интерфейса. Разумное и полное использование утверждений может не только улучшить качество нашего тестирования, но и помочь нам быстро обнаружить проблемы. В то же время формирование хорошей стратегии утверждения также особенно важно для поддержания и постоянного улучшения среды тестирования.

Если у вас есть какие-либо вопросы, пожалуйста, оставьте сообщение ниже ~

boy illustration
Углубленный анализ переполнения памяти CUDA: OutOfMemoryError: CUDA не хватает памяти. Попыталась выделить 3,21 Ги Б (GPU 0; всего 8,00 Ги Б).
boy illustration
[Решено] ошибка установки conda. Среда решения: не удалось выполнить первоначальное зависание. Повторная попытка с помощью файла (графическое руководство).
boy illustration
Прочитайте нейросетевую модель Трансформера в одной статье
boy illustration
.ART Теплые зимние предложения уже открыты
boy illustration
Сравнительная таблица описания кодов ошибок Amap
boy illustration
Уведомление о последних правилах Points Mall в декабре 2022 года.
boy illustration
Даже новички могут быстро приступить к работе с легким сервером приложений.
boy illustration
Взгляд на RSAC 2024|Защита конфиденциальности в эпоху больших моделей
boy illustration
Вы используете ИИ каждый день и до сих пор не знаете, как ИИ дает обратную связь? Одна статья для понимания реализации в коде Python общих функций потерь генеративных моделей + анализ принципов расчета.
boy illustration
Используйте (внутренний) почтовый ящик для образовательных учреждений, чтобы использовать Microsoft Family Bucket (1T дискового пространства на одном диске и версию Office 365 для образовательных учреждений)
boy illustration
Руководство по началу работы с оперативным проектом (7) Практическое сочетание оперативного письма — оперативного письма на основе интеллектуальной системы вопросов и ответов службы поддержки клиентов
boy illustration
[docker] Версия сервера «Чтение 3» — создайте свою собственную программу чтения веб-текста
boy illustration
Обзор Cloud-init и этапы создания в рамках PVE
boy illustration
Корпоративные пользователи используют пакет регистрационных ресурсов для регистрации ICP для веб-сайта и активации оплаты WeChat H5 (с кодом платежного узла версии API V3)
boy illustration
Подробное объяснение таких показателей производительности с высоким уровнем параллелизма, как QPS, TPS, RT и пропускная способность.
boy illustration
Удачи в конкурсе Python Essay Challenge, станьте первым, кто испытает новую функцию сообщества [Запускать блоки кода онлайн] и выиграйте множество изысканных подарков!
boy illustration
[Техническая посадка травы] Кровавая рвота и отделка позволяют вам необычным образом ощипывать гусиные перья! Не распространяйте информацию! ! !
boy illustration
[Официальное ограниченное по времени мероприятие] Сейчас ноябрь, напишите и получите приз
boy illustration
Прочтите это в одной статье: Учебник для няни по созданию сервера Huanshou Parlu на базе CVM-сервера.
boy illustration
Cloud Native | Что такое CRD (настраиваемые определения ресурсов) в K8s?
boy illustration
Как использовать Cloudflare CDN для настройки узла (CF самостоятельно выбирает IP) Гонконг, Китай/Азия узел/сводка и рекомендации внутреннего высокоскоростного IP-сегмента
boy illustration
Дополнительные правила вознаграждения амбассадоров акции в марте 2023 г.
boy illustration
Можно ли открыть частный сервер Phantom Beast Palu одним щелчком мыши? Супер простой урок для начинающих! (Прилагается метод обновления сервера)
boy illustration
[Играйте с Phantom Beast Palu] Обновите игровой сервер Phantom Beast Pallu одним щелчком мыши
boy illustration
Maotouhu делится: последний доступный внутри страны адрес склада исходного образа Docker 2024 года (обновлено 1 декабря)
boy illustration
Кодирование Base64 в MultipartFile
boy illustration
5 точек расширения SpringBoot, супер практично!
boy illustration
Глубокое понимание сопоставления индексов Elasticsearch.
boy illustration
15 рекомендуемых платформ разработки с нулевым кодом корпоративного уровня. Всегда найдется та, которая вам понравится.
boy illustration
Аннотация EasyExcel позволяет экспортировать с сохранением двух десятичных знаков.