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

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

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

  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
Неразрушающее увеличение изображений одним щелчком мыши, чтобы сделать их более четкими артефактами искусственного интеллекта, включая руководства по установке и использованию.
boy illustration
Копикодер: этот инструмент отлично работает с Cursor, Bolt и V0! Предоставьте более качественные подсказки для разработки интерфейса (создание навигационного веб-сайта с использованием искусственного интеллекта).
boy illustration
Новый бесплатный RooCline превосходит Cline v3.1? ! Быстрее, умнее и лучше вилка Cline! (Независимое программирование AI, порог 0)
boy illustration
Разработав более 10 проектов с помощью Cursor, я собрал 10 примеров и 60 подсказок.
boy illustration
Я потратил 72 часа на изучение курсорных агентов, и вот неоспоримые факты, которыми я должен поделиться!
boy illustration
Идеальная интеграция Cursor и DeepSeek API
boy illustration
DeepSeek V3 снижает затраты на обучение больших моделей
boy illustration
Артефакт, увеличивающий количество очков: на основе улучшения характеристик препятствия малым целям Yolov8 (SEAM, MultiSEAM).
boy illustration
DeepSeek V3 раскручивался уже три дня. Сегодня я попробовал самопровозглашенную модель «ChatGPT».
boy illustration
Open Devin — инженер-программист искусственного интеллекта с открытым исходным кодом, который меньше программирует и больше создает.
boy illustration
Эксклюзивное оригинальное улучшение YOLOv8: собственная разработка SPPF | SPPF сочетается с воспринимаемой большой сверткой ядра UniRepLK, а свертка с большим ядром + без расширения улучшает восприимчивое поле
boy illustration
Популярное и подробное объяснение DeepSeek-V3: от его появления до преимуществ и сравнения с GPT-4o.
boy illustration
9 основных словесных инструкций по доработке академических работ с помощью ChatGPT, эффективных и практичных, которые стоит собрать
boy illustration
Вызовите deepseek в vscode для реализации программирования с помощью искусственного интеллекта.
boy illustration
Познакомьтесь с принципами сверточных нейронных сетей (CNN) в одной статье (суперподробно)
boy illustration
50,3 тыс. звезд! Immich: автономное решение для резервного копирования фотографий и видео, которое экономит деньги и избавляет от беспокойства.
boy illustration
Cloud Native|Практика: установка Dashbaord для K8s, графика неплохая
boy illustration
Краткий обзор статьи — использование синтетических данных при обучении больших моделей и оптимизации производительности
boy illustration
MiniPerplx: новая поисковая система искусственного интеллекта с открытым исходным кодом, спонсируемая xAI и Vercel.
boy illustration
Конструкция сервиса Synology Drive сочетает проникновение в интрасеть и синхронизацию папок заметок Obsidian в облаке.
boy illustration
Центр конфигурации————Накос
boy illustration
Начинаем с нуля при разработке в облаке Copilot: начать разработку с минимальным использованием кода стало проще
boy illustration
[Серия Docker] Docker создает мультиплатформенные образы: практика архитектуры Arm64
boy illustration
Обновление новых возможностей coze | Я использовал coze для создания апплета помощника по исправлению домашних заданий по математике
boy illustration
Советы по развертыванию Nginx: практическое создание статических веб-сайтов на облачных серверах
boy illustration
Feiniu fnos использует Docker для развертывания личного блокнота Notepad
boy illustration
Сверточная нейронная сеть VGG реализует классификацию изображений Cifar10 — практический опыт Pytorch
boy illustration
Начало работы с EdgeonePages — новым недорогим решением для хостинга веб-сайтов
boy illustration
[Зона легкого облачного игрового сервера] Управление игровыми архивами
boy illustration
Развертывание SpringCloud-проекта на базе Docker и Docker-Compose