Фреймворк тестирования интерфейса Каратэ
Фреймворк тестирования интерфейса Каратэ

Что такое каратэ

KarateЭто инструмент, который автоматизирует интерфейстест、mock、производительностьтестсобрал вместетестрамка。использоватьBDDграмматика,Это также легко для людей без навыков программирования; он также предоставляет мощные функции утверждения JSON и XML и одновременное выполнение. Вышеуказанный контент переведен с официального сайта каратэ.,Возможно, когда вы видите эти описания, вы все еще не можете интуитивно почувствовать разницу между Karate и другими фреймворками тестирования интерфейса.,Далее давайте посмотрим на тестовую демонстрацию интерфейса, написанную Karate. Ниже приведен интерфейс Graphql.,Ниже приведен код, который использует Karate для реализации теста интерфейса.

Используйте Karate для написания сценариев тестирования интерфейса.

демо.Код функции

Язык кода:javascript
копировать
Feature: test a graphql demo    //Информация об описании функции. Функция может содержать несколько сценариев.
  Scenario Outline: test a graphql demo         //информация описания сценария
    * text queryString =                  //Определяем оператор запроса графа ql
    """{
    product(id: <id>) {
    name
    description
    category {
      name
    }
  }}"""
    Given url 'https://demo.getsaleor.com/graphql/'    //Вызывающий интерфейс принимает формат «данно-когда-то»
    And request {query : '#(queryString)'}
    When method post
    Then status 200                  //Интерфейс проверки возвращает код состояния 200
    And  match response.data.product.category.name == <expectValue>   
    //match — это ключевое слово в карате, часто используемое для проверки ответа интерфейса.
    Examples:                                    //Вы можете видеть, что Каратэ поддерживает управление данными
      | id                 | expectValue |
      | "UHJvZHVjdDo4Nw==" | 'Footwear'  |
      | "UHJvZHVjdDo3Nw==" | 'Juices'   

Код DemoRunner, следующий код представляет собой фиксированный способ написания, и его функция заключается в запуске содержимого, написанного в этой функции.

Язык кода:javascript
копировать
package examples.demo;
import com.intuit.karate.junit5.Karate;

public class DemoRunner {
    @Karate.Test
    Karate testDemo() {
        return new Karate().feature("demo").relativeTo(getClass());
    }
}

Создавайте красивые отчеты о тестировании и просматривайте запросы и ответы на вызовы интерфейса.

Из приведенной выше демонстрации вы можете видеть, что, как представлено на официальном сайте Karate, даже люди без какого-либо опыта программирования могут написать код в Feature для реализации вызовов интерфейса с небольшим обучением. Кроме того, отчет о тестировании, созданный этим инструментом, не только красив, но и позволяет просматривать запросы и ответы, вызываемые интерфейсом, что способствует отладке. Учитывая это, кажется, что Karate действительно лучше других инструментов. Однако при реализации тестирования интерфейса в реальных проектах, помимо вызовов интерфейса, необходимо учитывать и другие вещи. Действительно ли Karate лучше других инструментов тестирования, зависит от того, действительно ли Karate лучше других инструментов тестирования. он поддерживает эти аспекты. Хорошо, сначала давайте посмотрим на другие вещи, которые следует учитывать при тестировании интерфейса.

  • 1.Управление тестовыми данными, которое автоматически подготавливает и очищает тестовые данные.
  • 2.Управление информацией о конфигурации для облегчения переключения на различные среды работы.
  • 3.Проверка схемы ответа интерфейса
  • 4.Механизм ожидания по умолчанию для обеспечения стабильности тестирования интерфейса.。Потому что после завершения вызова интерфейса,Результаты вызова интерфейса необходимо проверить.,Может быть, чек Ответ интерфейса Соответствует ли содержимое тела данным базы данных, или вы можете напрямую проверить правильность данных базы данных, и данные обычно попадают позже, чем завершается вызов интерфейса, поэтому во многих случаях необходимо добавить механизм ожидания по умолчанию. места.
  • 5.Уменьшите чувствительность конфиденциальных данных, используемых при тестировании интерфейсов и т. д.

Пункты 1, 4 и 5 можно охарактеризовать как «комбинацию среды тестирования интерфейса и языка программирования», которая облегчает добавление, удаление, изменение и проверку данных базы данных, а также вызов методов, заложенных в программном обеспечении. Эти методы могут использоваться для снижения чувствительности конфиденциальных данных. Это может быть ожидание по умолчанию, вторичная обработка данных базы данных и т. д.

Далее посмотрим, есть ли у Karate хорошая поддержка в плане «интеграции с языками программирования», «обработки данных базы данных», «управления информацией о конфигурации» и «проверки схемы ответа»?

Каратэ вызывает метод Java Demo (Каратэ поддерживает только Java)

Класс Java с именем «Сервис», этот код содержит два метода.

Язык кода:javascript
копировать
package util;
import static java.lang.Thread.sleep;
public class Service {
    public void defaultWait(int i) throws InterruptedException {
        sleep(1000 * i);
        System.out.println("wait " + i + " seconds");
    }

    public String returnHello(String name) {
        return "Hello " + name;
    }
}

При вызове написанного метода Java в файле Feature вы можете видеть, что, поскольку его можно вызвать только в файле Feature, читаемость немного плохая.

Язык кода:javascript
копировать
Feature: call java function demo
  Scenario: call java function demo
    * def service =
  """
  function(arg) {
    var Service = Java.type('util.Service');
    var jd = new Service();
    return jd.returnHello(arg);
  }
  """
# in this case the solitary 'call' argument is of type string
    * def result = call service 'qiaotl'    //Первый вызывающий метод
    * match result == 'Hello qiaotl'

# using a static method - observe how java interop is truly seamless !
    * def Service = Java.type('util.Service')
    * def javaService = new Service()
    * javaService.defaultWait(1)   //Второй метод вызова

Используйте Karate для работы с данными базы данных Демо

На самом деле в Karate есть два способа вызова базы данных. Первый — использовать Java для написания методов добавления, удаления, изменения и запроса данных, а затем вызывать методы Java в файле Feature. Второй — напрямую использовать эти методы. предоставлено Karate для работы с данными базы данных. Первый способ вызова методов Java был продемонстрирован в приведенной выше демонстрации. Здесь мы покажем, как использовать Karate для непосредственной работы с данными базы данных. Демо-код для прямого подключения к базе данных для запроса данных в файле Feature показан ниже. Видно, что он похож на вызов метода Java, но немного плохо читается.

Язык кода:javascript
копировать
Feature: call database demo
  Scenario: call database
# use jdbc to validate
* def config = { username: 'sa', password: '', url: 'jdbc:h2:mem:testdb', driverClassName: 'org.h2.Driver' }
* def DbUtils = Java.type('com.intuit.karate.demo.util.DbUtils')
* def db = new DbUtils(config)
# since the DbUtils returns a Java Map, it becomes normal JSON here !
# which means that you can use the full power of Karate's 'match' syntax
* def dogs = db.readRows('SELECT * FROM DOGS')
* match dogs contains { ID: '#(id)', NAME: 'Scooby' }

* def dog = db.readRow('SELECT * FROM DOGS D WHERE D.ID = ' + id)
* match dog.NAME == 'Scooby'

* def test = db.readValue('SELECT ID FROM DOGS D WHERE D.ID = ' + id)
* match test == id

Используйте Karate для управления информацией о конфигурации

Что касается управления информацией о конфигурации, Karate обеспечивает встроенную поддержку, а файл управления информацией о конфигурации «karate-config.js» будет автоматически создан при инициализации проекта. Если есть другая информация о конфигурации, связанная с средой, вам нужно только добавить ее в этот файл, поэтому Karate достаточно хорошо поддерживает управление информацией о конфигурации.

Язык кода:javascript
копировать
function fn() {    
  var env = karate.env; // get system property 'karate.env'
  karate.log('karate.env system property was:', env);
  if (!env) {
    env = 'dev';
  }
  var config = {
    env: env,
    myVarName: 'someValue'
  }
  if (env == 'dev') {
    // customize
    // e.g. config.foo = 'bar';
  } else if (env == 'e2e') {
    // customize
  }
  return config;
}

Используйте каратэ для проверки схемы ответа

Согласно введению на официальном сайте, Karate предоставляет более простой и мощный способ проверки схемы ответа интерфейса, чем JSON-схема. То есть, используя Karate для проверки схемы ответа, вам необходимо сначала изучить правила синтаксиса. Проверка схемы. Например, следующий небольшой пример

Язык кода:javascript
копировать
* def foo = ['bar', 'baz']
# Убедитесь, что foo является массивом
* match foo == '#[]'
# Убедитесь, что foo является массивом длины 2.
* match foo == '#[2]'
# Убедитесь, что foo является массивом длины 2.,И значения массива всеstringтип
* match foo == '#[2] #string'
# Каждый элемент массива имеет длину атрибуты, а значение длины равно 3
* match foo == '#[]? _.length == 3'
# Убедитесь, что каждое значение в массиве является строкой и ее длина равна 3.
* match foo == '#[] #string? _.length == 3'

Если вы проверите схему ответа интерфейса, код в Feature будет выглядеть следующим образом. Вы увидите, что по сравнению с инструментами тестирования интерфейса, которые напрямую используют схему Json (например, Rest-Assured), использование Karate для проверки схемы ответа требует отдельного изучения Karate. Грамматика имеет определенную стоимость обучения.

Язык кода:javascript
копировать
* def oddSchema = { price: '#string', status: '#? _ < 3', ck: '##number', name: '#regex[0-9X]' }
* def isValidTime = read('time-validator.js')
When method get
Then match response ==
  """
  { 
    id: '#regex[0-9]+',
    count: '#number',
    odd: '#(oddSchema)',
    data: { 
      countryId: '#number', 
      countryName: '#string', 
      leagueName: '##string', 
      status: '#number? _ >= 0', 
      sportName: '#string',
      time: '#? isValidTime(_)'
    },
    odds: '#[] oddSchema'  
  }
  """

Вы можете видеть, что при использовании Karate все основные сценарии для вызова и проверки интерфейса находятся в файле Feature. Кроме того, он поддерживает множество пользовательских ключевых слов, таких как match, contains и т. д., что еще больше снижает затраты на написание сценариев тестирования интерфейса и позволяет людям без какого-либо опыта программирования быстро приступить к работе. Если вы просто напишете простой сценарий, например «вызов интерфейса», простота использования Karate и встроенная поддержка BDD действительно хороши. Однако для сложной системы сцена, которая должна быть охвачена тестом интерфейса, не является строго самим вызовом интерфейса. Характеристика «все основные сценарии находятся в файле функций» в Karate просто налагает на инструмент ограничения, такие как: вызов методов Java, подключение базы данных и т. д. Как говорится, успех – это тоже провал, а провал – это провал.

В начале упоминалось, что эта структура рекомендуется в технологическом радаре ThoughtWorks. Какова конкретная информация? Платформа действительно появилась на технологическом радаре в первой половине 2019 года в разделе Access. Подробное описание платформы в Technology Radar звучит так: «Karate — это среда тестирования API. Особенностью является то, что она написана непосредственно на Gerkin, не полагаясь на какой-либо язык программирования общего назначения. Karate на самом деле является языком предметной области, описывающим тестирование API. Хотя этот подход интересен и предоставляет очень удобочитаемую документацию для простых тестов, но конкретный язык, используемый для полезных данных сопоставления и проверки, может стать синтаксически тяжелым и трудным для понимания в долгосрочной перспективе, если сложные тесты написаны в этом стиле. Простота чтения и простота. Простоту понимания еще предстоит увидеть». Видно, что основная особенность этого инструмента упоминается в технологическом радаре, а также упоминается, что этот стиль написания может быть трудным для чтения и понимания при проведении сложных тестов.

кроме,Вначале мы также упомянули, что этот фреймворк всегда привязан к тесту интерфейса Graphql.,Так есть ли у этого инструмента особые преимущества в тесте интерфейса Graphql? Далее давайте посмотрим на сравнение использования Graphql и использования Rest-Assured (еще одного инструмента интерфейса) для вызова интерфейса Graphql.,Используемый тестируемый интерфейс — это интерфейс из первой демонстрации.

Каратэ вызывает интерфейс Graphql

демо.Код функции

Язык кода:javascript
копировать
Feature: test a graphql demo    //Информация о представлении функции. Функция может содержать несколько сценариев.
  Scenario Outline: test a graphql demo         //информация описания сценария
    * text queryString =                       //Определяем оператор запроса графа ql
    """{
    product(id: <id>) {
    name
    description
    category {
      name
    }
  }}"""
    Given url 'https://demo.getsaleor.com/graphql/'   //Вызывающий интерфейс принимает формат «данно-когда-то»
    And request {query : '#(queryString)'}
    When method post
    Then status 200                  //Интерфейс проверки возвращает код состояния 200
    And  match response.data.product.category.name == <expectValue>  
 //match — это ключевое слово в карате, часто используемое для проверки ответа интерфейса.
    Examples:                     //Вы можете видеть, что Каратэ поддерживает управление данными Метод письма
      | id                 | expectValue |
      | "UHJvZHVjdDo4Nw==" | 'Footwear'  |
      | "UHJvZHVjdDo3Nw==" | 'Juices'   

Rest-Assured вызывает интерфейс Graphql

Язык кода:javascript
копировать
package com.github.graphqlDemo
import groovy.json.JsonSlurper
import org.junit.Assert
import spock.lang.Specification
import static io.restassured.RestAssured.given

class GraphqlTest extends Specification {

    def "call graphql demo"() {
        given: "get graphql query string"    //Используем структуру spock для реализации BDD
        def queryString = new QueryBody()
                .setId(id)
                .getQueryBody()    //Запрос путем введения параметризованного интерфейса инструмента шаблонизации body
        when: "call the api"
        def res = given().baseUri("https://demo.getsaleor.com")
                .header("Content-Type", "application/json")
                .body(queryString)
                .post("/graphql")
                .then().statusCode(200)
                .extract().response().getBody().asString()     
             //Вызываем интерфейс и получаем ответ body
        def jsonResponse = new JsonSlurper().parseText(res)    
       //Изменяем тип строки ответа Преобразование тела в объект данных

        then: "should return correct response"
        Assert.assertEquals(jsonResponse.data.product.category.name, expectValue)  
       //Проверяем ответ содержимое тела
        where:
        id                 | expectValue     //принятый на основе данных
        "UHJvZHVjdDo4Nw==" | "Footwear"
        "UHJvZHVjdDo3Nw==" | "Juices"
    }
}

Вы можете видеть, что Rest-Assured также может реализовать тестирование интерфейса Graphql, поскольку интерфейс Graphql на самом деле представляет собой HTTP-запрос. Так есть ли у каратэ какие-то особые преимущества? На самом деле нет. Например, Karate поддерживает передачу параметров в теле запроса. Хотя Rest-Assured не поддерживает это изначально, его можно параметризовать с помощью инструментов шаблонизатора. Karate поддерживает BDD. Хотя Rest-Assured не поддерживает его изначально, он может реализовать BDD, применив структуру BDD Spock на официальном веб-сайте Groovy. Кажется, что при использовании Rest-Assured вам нужно применять другие фреймворки, что увеличивает стоимость использования. Однако именно потому, что Rest-Assured не интегрирует различные другие фреймворки, он сохраняет гибкость и может беспрепятственно работать с несколькими языками программирования. и другие среды тестирования.

Заключение

Если вам необходимо сделать выбор в инструменте тестирования интерфейса,Студентам, знакомым со стеком технологий Java, настоятельно рекомендуется использовать Rest-Assured.,Первая версия этого инструмента была выпущена в 2010 году.,Количество звезд на github перевалило за 4000+,Очень широко используется. Хотя название второго инструмента Rest-Assured,Но вы можете использовать этот инструмент для завершения теста интерфейса Graphql. В-третьих, инструмент поддерживает использование в сочетании с несколькими языками.,Пример языка сценариев Groovy. Что касается интерфейсов, то лучше использовать скриптовый язык.,Потому что сам тест интерфейса не имеет сложной логической обработки,Языка сценариев достаточно.,Немного сложно выбрать такой язык, как Java.,Это увеличит стоимость обслуживания интерфейса. Если вас интересует Rest-Assured, вы можете подписаться на колонку «Практический бой интерфейса» в Gitchat, чтобы узнать больше (https://gitbook.cn/gitchat/column/5dbbe297e29af65d1d01b8fc).

Заявление об авторских правах: Содержание этой статьи добровольно предоставлено пользователями Интернета, а мнения, выраженные в этой статье, представляют собой только точку зрения автора. Этот сайт предоставляет только услуги по хранению информации, не имеет никаких прав собственности и не принимает на себя соответствующие юридические обязательства. Если вы обнаружите на этом сайте какое-либо подозрительное нарушение авторских прав/незаконный контент, отправьте электронное письмо, чтобы сообщить. После проверки этот сайт будет немедленно удален.

Издатель: Лидер стека программистов полного стека, укажите источник для перепечатки: https://javaforall.cn/203459.html Исходная ссылка: https://javaforall.cn

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 позволяет экспортировать с сохранением двух десятичных знаков.