KarateЭто инструмент, который автоматизирует интерфейстест、mock、производительностьтестсобрал вместетестрамка。использоватьBDDграмматика,Это также легко для людей без навыков программирования; он также предоставляет мощные функции утверждения JSON и XML и одновременное выполнение. Вышеуказанный контент переведен с официального сайта каратэ.,Возможно, когда вы видите эти описания, вы все еще не можете интуитивно почувствовать разницу между Karate и другими фреймворками тестирования интерфейса.,Далее давайте посмотрим на тестовую демонстрацию интерфейса, написанную Karate. Ниже приведен интерфейс Graphql.,Ниже приведен код, который использует Karate для реализации теста интерфейса.
демо.Код функции
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, следующий код представляет собой фиксированный способ написания, и его функция заключается в запуске содержимого, написанного в этой функции.
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, 4 и 5 можно охарактеризовать как «комбинацию среды тестирования интерфейса и языка программирования», которая облегчает добавление, удаление, изменение и проверку данных базы данных, а также вызов методов, заложенных в программном обеспечении. Эти методы могут использоваться для снижения чувствительности конфиденциальных данных. Это может быть ожидание по умолчанию, вторичная обработка данных базы данных и т. д.
Далее посмотрим, есть ли у Karate хорошая поддержка в плане «интеграции с языками программирования», «обработки данных базы данных», «управления информацией о конфигурации» и «проверки схемы ответа»?
Класс Java с именем «Сервис», этот код содержит два метода.
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, читаемость немного плохая.
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 есть два способа вызова базы данных. Первый — использовать Java для написания методов добавления, удаления, изменения и запроса данных, а затем вызывать методы Java в файле Feature. Второй — напрямую использовать эти методы. предоставлено Karate для работы с данными базы данных. Первый способ вызова методов Java был продемонстрирован в приведенной выше демонстрации. Здесь мы покажем, как использовать Karate для непосредственной работы с данными базы данных. Демо-код для прямого подключения к базе данных для запроса данных в файле Feature показан ниже. Видно, что он похож на вызов метода Java, но немного плохо читается.
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-config.js» будет автоматически создан при инициализации проекта. Если есть другая информация о конфигурации, связанная с средой, вам нужно только добавить ее в этот файл, поэтому Karate достаточно хорошо поддерживает управление информацией о конфигурации.
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 для проверки схемы ответа, вам необходимо сначала изучить правила синтаксиса. Проверка схемы. Например, следующий небольшой пример
* 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. Грамматика имеет определенную стоимость обучения.
* 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.,Используемый тестируемый интерфейс — это интерфейс из первой демонстрации.
демо.Код функции
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'
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