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.
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
Ungaququzelela kwaye uyile iprojekthi yeposi ngolu hlobo:
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; }
@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.
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.
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', }
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
.
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.
mvn clean test -DargLine='-Dkarate.env=staging' -Dtest=TestRunner_FR
Apha, sisebenzisa i-TestRunner_FR yeklasi kunye nokuseta imeko-bume njengendawo yokuma.
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.
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
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.