Karate API Testing Tool svindlblað

Karate er open source API prófunartæki þróað af Peter Thomas frá Intuit. Karate er byggt ofan á HttpClient og Agúrka og hefur sína eigin DSL til að gera API prófanir mjög auðveldar. Þótt það hafi verið til í næstum ár hefur það þroskast mjög fljótt og hefur alla möguleika sem búast má við af API prófunartæki.

Vegna þess að Karate situr ofan á agúrku, erfir það alla virkni agúrku, svo að þú getur skrifað API prófin þín á einfaldan hátt Gefið þegar síðan sniðið og notað öll gúrkulykilorð eins og Feature, Scenario Outline, Scenario, dæmi, Feature tagging.

Ég hef búið til þetta svindlblað til að hjálpa öllum sem taka þátt í að prófa forritaskil, með dæmum um notkun Karate tólsins.

Vinsamlegast athugið , þetta svindl er aðeins toppurinn á ísjakanum. Karate hefur marga aðra eiginleika sem ekki eru nefndir hér. Þessi listi er aðeins algengasta aðgerðin sem venjulega er notuð við prófun á API.

Bæta við ósjálfstæði (pom.xml)


UTF-8
3.7.0
1.8
1.8
1.8
0.8.0.RC4
3.13.0


com.intuit.karate
karate-core
${karate.version}


com.intuit.karate
karate-apache
${karate.version}
test


com.intuit.karate
karate-testng
${karate.version}


net.masterthought
cucumber-reporting
${cucumber.reporting.version}
test

Uppbygging verkefnis

Þú getur skipulagt og uppbyggt maven verkefnið þitt svona:



karate-config.js

Þetta er þar sem þú getur búið til breytur sem hafa alþjóðlegt umfang. Karate les þessa skrá áður en hún framkvæmir einhverjar atburðarás. Þetta kemur sér mjög vel þegar skipt er um umhverfi þar sem sérstakar breytur eru notaðar fyrir mismunandi umhverfi

function() {
var env = karate.env; // get java system property 'karate.env'
karate.log('karate.env selected environment was:', env);
karate.configure('ssl', true)
if (!env) {
env = 'dev'; //env can be anything: dev, qa, staging, etc.
}
var config = {
env: env,
AM_USERNAME: 'devuser',
AM_PASSWORD: 'devpass',
AM_HOST: 'https://am.'+env+'.example.net',
AM_AUTHENTICATE_PATH: '/am/json/realms/root/authenticate',
IDM_USERNAME: 'devuser',
IDM_PASSWORD: 'devpass',
IDM_HOST: 'https://idm.'+env+'.example.net',
IDM_MANAGED_USER_PATH: '/idm/managed/user',
};
if(env == 'qa') {
config.AM_USERNAME: 'myUserName'
config.AM_PASSWORD: 'myPa55word'
}
if(env == 'live') {
config.AM_USERNAME: 'admin'
config.AM_PASSWORD: 'secret'
}
karate.log('OpenAM Host:', config.AM_HOST);
karate.configure('connectTimeout', 60000);
karate.configure('readTimeout', 60000);
return config; }

Hvernig á að senda HTTP beiðni (fá, senda, setja, eyða, plástra)

@FR Feature: AM Admin Login
Scenario: Login as Admin to AM and get token
Given header X-OpenAM-Username = AM_USERNAME
Given header X-OpenAM-Password = AM_PASSWORD
Given url AM_HOST + AM_AUTHENTICATE_PATH
And request ''
When method POST
Then status 200
* assert response.tokenId != null
* def tokenId = response.tokenId

Í dæminu hér að ofan koma AM_USERNAME, AM_PASSWORD, AM_HOST og AM_AUTHENTICATE_PATH frá karate-config.js skjal.

' 'Er hægt að túlka sem eitthvað af Given, When, Then og And, en þegar aðgerð þjónar ekki samhengi, getum við notað' '.

’+’ Virkar sem samtengdur rekstraraðili

Dæmið hér að ofan sendir tóma beiðni um meginmál. Við getum bara notað ‘‘

Aðferðin getur verið hvaða gild HTTP-sögn sem er (Fá, senda, setja, setja, eyða)

' def ’Er notað til að geyma gildi í breytu.

haus , url , beiðni , aðferð , stöðu , svar eru öll lykilorð karate sem mynda DSL. Fyrir alla lista yfir lykilorð, heimsóttu Intuit.

Í dæminu hér að ofan er svarið JSON snið, svo við getum notað innbyggða JsonPath táknmynd karate til að flokka svarið.

Biðja um keðju með mörgum API símtölum

Feature: request chaining with multiple api calls Scenario: chain request demo
* json req = read('classpath:com/example/templates/idm/create-user-template.json')
* def user = req.givenName
Given header X-Username = 'anonymous'
Given header X-Password = 'anonymous'
Given url AM_HOST + '/some/endpoint
And request ''
When method POST
* def authId = response.authId
* def payload1 =
'''
{'authId':'${authId}','callbacks':[{'type':'NameCallback','output':[{'name':'prompt','value':'Email Address'}],'input':[{'name':'IDToken0','value':'${user}@putsbox.com'}]}]}
'''
* replace payload1
| token
| value |
| ${authId} | authId |
| ${user} | user |
* json mypayload1 = payload1
Given header X-Username = 'anonymous'
Given header X-Password = 'anonymous'
Given url AM_HOST + '/openam/some-other-endpoint
And request mypayload1
When method POST

Í dæminu hér að ofan er fyrsta símtalið hringt og authId þáttað frá svari og vistað í breytu sem kallast authId. Við skiptum síðan um annað álagið með authId sótt í fyrsta símtalinu. Við notum síðan nýja álagið til að senda í næsta API símtal.

Hvernig á að lesa beiðni sniðmát og hringja í aðrar eiginleikaskrár

Við getum gert sviðsmyndir okkar endurnýtanlegar og kallað þær úr öðrum eiginleikaskrám. Í þessu dæmi getum við búið til „almenna“ skapa-notanda.feature skrá þar sem við getum sent búið til notanda beiðni en með öðrum beiðni aðila

Feature: Create User in IDM
Scenario: Create user in IDM with given guid
Given header X-Requested-With = 'Swagger-UI'
Given header X-OpenIDM-Username = IDM_USERNAME
Given header X-OpenIDM-Password = IDM_PASSWORD
Given url IDM_HOST + IDM_MANAGED_USER_PATH
And request __arg
When method POST
Then status 201

Athugið, í dæminu hér að ofan erum við að nota ‘__arg’ sem beiðni um innlegg.

Við getum þá hringt í ofangreinda eiginleikaskrá og sent inn nauðsynlegan póstlíkama sem við getum síðan lesið úr sniðmáti

Feature: Create a user
Scenario: Create user in IDM
* json myReq = read('classpath:com/example/templates/idm/idm-create-user-template.json')
* call read('classpath:com/example/idm/idm-create-user.feature') myReq

Ofangreindur kóði les sniðmát sem er á staðsetningu com/example/templates/idm/idm-create-user-template.json og geymir það sem JSON breytu sem kallast myReq

Þá getum við sent JSON breytuna í hina eiginleikaskrána með því að hringja aðferðina.

Sniðmátið lítur út eins og

{
'mail' : 'david@putsbox.com',
'givenName' : 'david',
'sn' : 'putsbox',
'jobRole' : 'developer',
'telephoneNumber' : '91234567890',
'dob' : '01/02/2010', }

Hvernig á að lesa aðrar eiginleikaskrár - dæmi 2

Við getum lesið tiltekna breytu í hinni kalluðu lögunaskrá sem er send úr starfshlutaskránni

Feature: Create User in IDM
Scenario: Create user in IDM with given guid
Given header X-Requested-With = 'Swagger-UI'
Given header X-OpenIDM-Username = IDM_USERNAME
Given header X-OpenIDM-Password = IDM_PASSWORD
Given url IDM_HOST + IDM_MANAGED_USER_PATH
And request __arg.emailAddress
When method POST
Then status 201

Athugið, í dæminu hér að ofan erum við að nota ‘__arg.emailAddress’ sem beiðni um innlegg. Við höfum aðeins áhuga á að senda netfangið sem beiðni

Við getum þá hringt í ofangreinda eiginleikaskrá og sent inn nauðsynlegan póstlíkama sem við getum síðan lesið úr sniðmáti

Feature: Create a user
Scenario: Create user in IDM
* json myReq = read('classpath:com/example/templates/idm/idm-create-user-template.json')
* json emailAddress = '{'emailAddress': '' +myReq.mail+ ''}'
* call read('classpath:com/example/fr/idm/idm-create-user.feature') emailAddress

Ofangreindur kóði dregur út póstreitinn úr JSON sniðmátinu. Þegar við sendum breytu yfir í aðra eiginleikaskrá verður hún að vera af gerðinni JSON, þannig að breytan emailAddress verður að vera gild JSON.

Þá getum við sent JSON breytuna í hina eiginleikaskrána með því að hringja aðferðina og verið að senda JSON breytuna, í þessu tilfelli, emailAddress

Búðu til próf hlaupara flokk

Við getum framkvæmt atburðarásina í eiginleikaskránni með því að nota maven (sem er gagnlegt til að keyra prófin í CI umhverfi)

import com.intuit.karate.cucumber.CucumberRunner; import com.intuit.karate.cucumber.KarateStats; import cucumber.api.CucumberOptions; import net.masterthought.cucumber.Configuration; import net.masterthought.cucumber.ReportBuilder; import org.apache.commons.io.FileUtils; import org.testng.annotations.Test; import java.io.File; import java.util.ArrayList; import java.util.Collection; import java.util.List; import static org.testng.AssertJUnit.assertTrue; @CucumberOptions(tags = {'@FR', '~@ignore'}) public class TestRunner_FR {
@Test
public void testParallel() {
String karateOutputPath = 'target/cucumber-html-reports';
KarateStats stats = CucumberRunner.parallel(getClass(), 1, karateOutputPath);
generateReport(karateOutputPath);
assertTrue('there are scenario failures', stats.getFailCount() == 0);
}
private static void generateReport(String karateOutputPath) {
Collection jsonFiles = FileUtils.listFiles(new File(karateOutputPath), new String[] {'json'}, true);
List jsonPaths = new ArrayList(jsonFiles.size());
for (File file : jsonFiles) {

jsonPaths.add(file.getAbsolutePath());
}
Configuration config = new Configuration(new File('target'), 'YOUR PROJECT NAME');
config.addClassifications('Environment', System.getProperty('karate.env'));
ReportBuilder reportBuilder = new ReportBuilder(jsonPaths, config);
reportBuilder.generateReports();
} }

Ofangreindur kóði keyrir allar eiginleikaskrár sem eru merktar „@FR“ en hunsa allar prófanir sem eru merktar „@ignore“.

Það býr einnig til gúrkuskýrslu til að sjá fyrir sér niðurstöður prófunarhlaupa.

Keyrðu prófanirnar frá skipanalínu eða CI

mvn clean test -DargLine='-Dkarate.env=staging' -Dtest=TestRunner_FR

Hér erum við að keyra TestRunner_FR bekkinn og setja umhverfið sem sviðsetningu.

Framkvæmdu JavaScript í Feature skránni

Í eiginleikaskrá höfum við getu til að framkvæma javascript líka

Feature: Generate a random session id
Scenario: generate random session id
* def random_string =
'''
function(s) {
var text = '';
var possible = 'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz';
for (var i = 0; i < s; i++)
text += possible.charAt(Math.floor(Math.random() * possible.length));
return text;
}
'''
* def sessionId = random_string(10)

Ofangreindur kóði býr til handahófsstreng af lengd 10 og vistar hann í breytu sem kallast sessionId.

Gagnastýrð próf

Þar sem Karate situr ofan á agúrku eru gagnadrifnar prófanir sjálfgefnar

Feature: Data driven testing example Scenario Outline: An 'Invalid input request' error is returned if required parameters have incorrect values.
* def attribute_name = ''
* xml malformed_request =
* json activate_request = malformed_request
* def activate_response = call read('activate.feature') activate_request
* match activate_response.contentType == 'text/xml;charset=ISO-8859-1'
* match activate_response.gas_version == '5.2.7'
* match activate_response.error_code == '1000'
Examples:
| name_attribute | method_call













|
| auth_method
| Java.type('com.example.StringUtil').removeNodeByAttribute(xml_req, attribute_name) |
| app_url
| Java.type('com.example.StringUtil').removeNodeByAttribute(xml_req, attribute_name) |

Í dæminu hér að ofan er notast við sviðsmynd Cucumber's Scenario og dæmi um lykilorð til að búa til gagnadrifin próf. Til að lesa hverja breytu notum við hornklofa

Hringdu í Java úr eiginleikaskrá

package com.example; public class StringUtil {
public static String getNumberFromString(String text) {
return text.replaceAll('\D+', '');
} }
Feature: Call java demo Scenario: Get number from text
Given url 'https://preview.putsbox.com/p/david/last.json'
When method GET
* def emailText = response.text
* def otpCode = Java.type('com.example.StringUtil').getNumberFromString(emailText)
* print otpCode

Ofangreind lögun skrá kallar Java aðferð í bekknum sem heitir StringUtil Vistar þá svar þess símtals við otpCode breytu.