Karate API Testing Isixhobo Cheat Sheet

IKarate sisixhobo sokuvavanya se-API esiveliswa ngu UPeter Thomas wase-Intuit. IKarate yakhelwe ngaphezulu kwe-HttpClient kunye nekhukhamba kwaye ine-DSL yayo yokwenza uvavanyo lwe-API lube lula kakhulu. Nangona ikho phantse unyaka, ikhule ngokukhawuleza kakhulu kwaye inazo zonke izakhono ezilindelwe kwizixhobo zovavanyo ze-API.

Kuba iKarate ihleli ngaphezulu kwe cucumber, ifumana konke ukusebenza kwe cucumber, ke ungabhala iimvavanyo zakho ze-API ngokulula xa unikwa ifomathi kwaye usebenzise onke amagama aphambili ekhukhamba anje ngeFature, Scenario Outline, Scenario, Examples, Feature tagging.

Ndenze eli phepha lokukopela ukunceda nabani na obandakanyekayo kuvavanyo lwe-API, enika imizekelo yendlela yokusebenzisa isixhobo seKarate.


Nceda qaphela , Eli phepha lokukopela liyincam yomkhenkce. IKarate inezinye izinto ezininzi ezingakhankanywanga apha. Olu luhlu yeyona nto ixhaphakileyo esetyenziswayo xa kuvavanywa ii-API.

Yongeza ukuxhomekeka (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

Ulwakhiwo lweProjekthi

Ungaququzelela kwaye uyile iprojekthi yeposi ngolu hlobo:


ikarati-yoqwalaselo

Kulapho unokwenza khona izinto ezinobubanzi behlabathi. IKarati ifunda le fayile ngaphambi kokwenza nayiphi na imeko. Oku kuza kuluncedo kakhulu xa kutshintshwa iimeko ezizezinye ezisetyenziselwa iimeko ezahlukeneyo

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; }

Ungasithumela njani isicelo seHTTP (Fumana, Thumela, Beka, Cima, iPatch)

@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

Kumzekelo ongentla, AM_USERNAME, AM_PASSWORD, AM_HOST, kunye no-AM_AUTHENTICATE_PATH bavela karate-config.js ifayile.

' 'Inokuchazwa njengayo nayiphi na into enikiweyo, Nini, emva koko, kwaye, kodwa xa isenzo singasebenzi umxholo, singasebenzisa' '.


’+’ Isebenza njengomqhubi wexesha elinye

Umzekelo ongentla uthumela isicelo esingenanto somzimba weposi. Singasebenzisa nje ‘’

Indlela inokuba yeyesenzi esisebenzayo se-HTTP (Fumana, Thumela, Beka, iPatch, Cima)

' Chaza ’Isetyenziselwa ukugcina ixabiso okwahlukileyo.


okubhaliweyo okuphezulu kwephepha , I-url , isicelo , indlela , iwonga , impendulo Onke amagama aphambili ekarate enza i-DSL. Uluhlu olupheleleyo lwamagama aphambili, ndwendwela i-Intuit.

Kumzekelo ongentla, impendulo yifomathi yeJSON, ukuze sisebenzise i-karate's builtin JsonPath notation ukubonisa impendulo.

Cela ukudityaniswa ngeefowuni ezininzi ze-API

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

Kumzekelo ongentla, umnxeba wokuqala wenziwa kwaye i-authId idlulisiwe ukusuka kwimpendulo kwaye igcinwe kuguquguquko olubizwa ngokuba yi-authId. Emva koko sibuyisela umrhumo wesibini wokuhlawula kunye ne-authId efunyenwe kwifowuni yokuqala. Sisebenzisa ke umthwalo omtsha wokuhlawula ukuthumela umnxeba olandelayo we-API.

Uzifunda njani izicelo zetemplate kwaye ubize ezinye iifayile zento

Sinokwenza iimeko zethu ziphinde zisetyenziswe kwaye sizitsalele umnxeba kwezinye iifayile zeefayile. Kulo mzekelo, sinokwenza ifayile 'generic' yokudala-yomsebenzisi apho sinokuthumela khona isicelo somsebenzisi kodwa ngomzimba wesicelo owahlukileyo


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

Qaphela, kumzekelo ongentla, sisebenzisa i '__arg' njengesicelo somzimba weposi.

Singayibiza le fayile ingentla kwaye sidlulise emzimbeni weposi ofunekayo, nathi emva koko sinokufunda kwitemplate

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

Le khowudi ingentla ifunda itemplate ekwindawo com/example/templates/idm/idm-create-user-template.json kwaye uyigcina njengomahluko weJSON obizwa ngokuba yi-myReq

Emva koko singathumela umahluko weJSON kwenye into yefayile usebenzisa indlela yokufowuna.


Itemplate ibonakala

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

Uzifunda njani ezinye iifayile zokwenza umzekelo-umzekelo 2

Singafunda umahluko okhethekileyo kwifayile yefayile edlulisiweyo evela kwifayile yefowuni

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

Qaphela, kumzekelo ongentla, sisebenzisa '__arg.emailAddress' njengesicelo somzimba weposi. Sinomdla kuphela ekuthumeleni idilesi ye-imeyile njengesicelo

Singayibiza le fayile ingentla kwaye sidlulise emzimbeni weposi ofunekayo, nathi emva koko sinokufunda kwitemplate

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

Le khowudi ingentla ikhupha intsimi yeposi kwitemplate yeJSON. Xa sidlulisa umahluko kwenye ifayile yefayile, kufuneka ibe luhlobo lweJSON, ke iAddress ye-imeyile eyahlukileyo kufuneka ibe yiJSON esebenzayo.

Emva koko singathumela umahluko weJSON kwenye ifayile yefayile sisebenzisa indlela yokufowuna kwaye sithumele umahluko weJSON, kule meko, emailAddress.

Yenza iklasi yoVavanyo loVavanyo

Singazenza iimeko kwifayile yenqaku sisebenzisa i-maven (eluncedo ukuqhuba uvavanyo kwimeko ye-CI)

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();
} }

Le khowudi ingentla iqhuba zonke iifayile ezibonakalayo ezimakwe njengo '@FR' kodwa ingazinanzi zonke iimvavanyo ezimakwe njengo '@ignore'.

Ikwadala ingxelo yekhukhamba yokujonga iziphumo zovavanyo.

Sebenzisa iimvavanyo kumgca wokuyalela okanye kwi-CI

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

Apha, sisebenzisa i-TestRunner_FR yeklasi kunye nokuseta imeko-bume njengendawo yokuma.

Yenza iJavaScript kwifayile yeNqaku

Kwifayile yefayile, sinakho ukwenza ijavascript ngokunjalo

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)

Le khowudi ingentla ivelisa umtya ongacwangciswanga wobude be-10 kwaye uyigcine ngokwahlukileyo okubizwa ngokuba yiseshiniId.

Uvavanyo oluqhutywa yidatha

Kuba iKarate ihleli ngaphezulu kwekhukhamba, ukuvavanywa kwedatha kuza ngokungagqibekanga

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) |

Umzekelo ongentla usebenzisa iCucumber's Scenario Outline kunye neMizekelo yamagama aphambili ukwenza uvavanyo oluqhutywa yidatha. Ukufunda iparameter nganye, sisebenzisa iibrakethi ze-engile

Fowunela iJava kwifayile yefayile

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

Le fayile ingentla ibiza indlela yeJava eklasini ebizwa ngokuba StringUtil. Emva koko igcina impendulo yaloo fowuni kwi-otpCode eguquguqukayo.