कराटे एपीआय चाचणी साधन फसवणूक पत्रक

कराटे हे विकसित केलेले एक ओपनसोर्स एपीआय चाचणी साधन आहे इंटूट मधील पीटर थॉमस. कराटे एचटीपीपीक्लिएंट आणि काकडीच्या शीर्षस्थानी तयार केलेले आहे आणि एपीआय चाचणी करणे खूप सोपे करण्यासाठी स्वतःचे डीएसएल आहे. जरी जवळपास एक वर्षापासून गेले असले तरी ते फार लवकर परिपक्व झाले आहे आणि एपीआय चाचणी साधनाकडून अपेक्षित असलेल्या सर्व क्षमता आहेत.

कराटे काकडीच्या वरच्या बाजूला असल्याने, त्याला काकडीच्या सर्व कार्यक्षमतेचा वारसा मिळाला आहे, ज्यामुळे आपण आपल्या एपीआय चाचण्या सोप्या मध्ये लिहू शकता जेव्हा दिल्यावर व्हेन फॉरमॅट करा आणि फीचर, परिदृश्य रूपरेषा, परिस्थिती, उदाहरणे, वैशिष्ट्य टॅगिंग यासारखे सर्व काकडी कीवर्ड वापरू शकता.

कराटे टूल कसे वापरावे याची उदाहरणे देऊन मी एपीआय चाचणी घेण्यात सामील असलेल्या कोणालाही मदत करण्यासाठी हे फसवणूक पत्रक तयार केले आहे.

कृपया लक्षात घ्या , ही फसवणूक पत्रक हिमखंडातील फक्त टीप आहे. कराटेची इतर वैशिष्ट्ये आहेत ज्यांचा येथे उल्लेख नाही. ही यादी एपीआयची चाचणी घेताना वापरली जाणारी सर्वात सामान्य ऑपरेशन्स आहे.

अवलंबन जोडा (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
|

प्रकल्प रचना

आपण याप्रकारे आपल्या मावेन प्रकल्पाचे आयोजन आणि रचना करू शकता:



कराटे-कॉन्फिगरेशन. js

येथेच आपण जागतिक स्कोप असलेले व्हेरिएबल्स तयार करू शकता. कोणताही परिदृश्य राबवण्यापूर्वी कराटे ही फाईल वाचतात. भिन्न वातावरणासाठी विशिष्ट व्हेरिएबल्स वापरल्या जाणार्‍या वातावरणास स्विच करताना हे अतिशय सुलभ होते

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
|

वरील उदाहरणात, AM_USERNAME, AM_PASSWORD, AM_HOST आणि AM_AUTHENTICATE_PATH | _ _ _ _ | वरून आले आहेत फाईल.

' ’दिले गेलेल्या, केव्हा, तेवढ्या नंतर, आणि म्हणून वर्णन केले जाऊ शकते परंतु जेव्हा कृती संदर्भ देत नाही, तेव्हा आम्ही वापरू शकतो‘ '.

’+’ कन्क्टेनेट ऑपरेटर म्हणून कार्य करते

वरील उदाहरण रिक्त पोस्ट बॉडी विनंती पाठवते. आम्ही फक्त ‘‘ वापरू शकतो

पद्धत कोणतीही वैध HTTP क्रियापद असू शकते (मिळवा, पोस्ट, पुट, ठिगळ, हटवा)

' Def ’व्हेरिएबलमध्ये व्हॅल्यू साठवण्यासाठी वापरला जातो.

शीर्षलेख , url , विनंती , पद्धत , स्थिती , प्रतिसाद डीएसएल बनविणारे सर्व कराटेचे कीवर्ड आहेत. कीवर्डच्या पूर्ण यादीसाठी, अंतर्ज्ञानास भेट द्या.

वरील उदाहरणात, प्रतिसाद जेएसओएन स्वरूप आहे, म्हणून आम्ही प्रतिसादाचे विश्लेषण करण्यासाठी कराटेचे बिल्टिन जेसनपाथ नोटेशन वापरू शकतो.

एकाधिक API कॉलसह चेनिंगची विनंती करा

karate-config.js |

वरील उदाहरणात, प्रथम कॉल केला जाईल आणि ऑथआयड प्रतिसादातून विश्लेषित केला गेला आणि authId नावाच्या व्हेरिएबलमध्ये सेव्ह केला. त्यानंतर आम्ही पहिल्या कॉलमध्ये पुनर्प्राप्त केलेल्या ऑथआइडसह दुसरा पेलोड पुनर्स्थित करतो. त्यानंतर आम्ही पुढचा एपीआय कॉल पाठविण्यासाठी नवीन पेलोड वापरतो.

विनंती टेम्पलेट्स कसे वाचावेत आणि इतर वैशिष्ट्य फायलींवर कॉल कसे करावे

आम्ही आमच्या परिस्थिती पुन्हा वापरण्यायोग्य बनवू आणि त्यांना इतर वैशिष्ट्य फायलींवरून कॉल करू शकतो. या उदाहरणात, आम्ही एक 'जेनेरिक' क्रिएन-यूझर. फीचर फाईल तयार करू शकतो जिथे आपण तयार वापरकर्त्याची विनंती पाठवू शकतो परंतु भिन्न विनंती असलेल्या मुख्य भागासह

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
|

लक्षात ठेवा, वरील उदाहरणात आम्ही पोस्ट-बॉडी रिक्वेस्ट म्हणून ‘__arg’ वापरत आहोत.

त्यानंतर आम्ही वरील वैशिष्ट्य फाइलवर कॉल करू आणि आवश्यक पोस्ट बॉडीमध्ये पास करू, जे त्याऐवजी आम्ही टेम्पलेटमधून वाचू शकतो

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
|

उपरोक्त कोड | टेम्पलेट वाचतो जे स्थानावर आहे. _ + _ | आणि हे मायरेक नावाचे जेएसओएन व्हेरिएबल म्हणून संग्रहित करते

तर आम्ही कॉल पद्धतीने JSON व्हेरिएबल दुसर्‍या फीचर फाईलवर पाठवू शकतो.

टेम्पलेट असे दिसते

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
|

इतर वैशिष्ट्य फायली कशा वाचाव्यात - उदाहरणार्थ 2

आम्ही कॉलिंग फीचर फाईलमधून पास केलेल्या फीचर फाईलमधे एक विशिष्ट व्हेरिएबल वाचू शकतो

com/example/templates/idm/idm-create-user-template.json |

टीप, वरील उदाहरणात आम्ही पोस्ट बॉडी रिक्वेस्ट म्हणून ‘__arg.emailAddress’ वापरत आहोत. आम्हाला केवळ विनंती म्हणून ईमेल पत्ता पाठविण्यात रस आहे

त्यानंतर आम्ही वरील वैशिष्ट्य फाइलवर कॉल करू आणि आवश्यक पोस्ट बॉडीमध्ये पास करू, जे त्याऐवजी आम्ही टेम्पलेटमधून वाचू शकतो

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

वरील कोड जेएसओएन टेम्पलेटमधून मेल फील्ड काढते. जेव्हा आम्ही व्हेरिएबलला दुसर्‍या फीचर फाईलमध्ये पाठवितो तेव्हा ते जेएसओएन प्रकाराचे असणे आवश्यक आहे, म्हणून व्हेरिएबल ईमेल एड्रेस वैध जेएसओएन असणे आवश्यक आहे.

तर आम्ही कॉल पद्धत वापरुन दुसर्‍या फीचर फाईलमध्ये JSON व्हेरिएबल पाठवू शकतो आणि JSON व्हेरिएबल पाठवत आहोत, या प्रकरणात, 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

चाचणी धावपटू वर्ग तयार करा

आम्ही मॅवेन (जे सीआय वातावरणात चाचण्या चालविण्यासाठी उपयुक्त आहे) वापरून फिचर फाईलमधील परिदृश्ये कार्यान्वित करू शकतो.

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
|

वरील कोड सर्व वैशिष्ट्य फायली चालविते ज्यांना “@FR” म्हणून टॅग केले आहे परंतु “@ignore” म्हणून टॅग केलेल्या सर्व चाचण्यांकडे दुर्लक्ष केले आहे.

तसेच चाचणी रनच्या निकालांची कल्पना करण्यासाठी एक काकडी अहवाल तयार करते.

कमांड लाइन किंवा सीआय पासून चाचण्या चालवा

emailAddress |

येथे आपण टेस्टरनर_एफआर वर्ग चालवित आहोत आणि पर्यावरण स्टेजिंग म्हणून सेट करत आहोत.

फीचर फाईलमध्ये जावास्क्रिप्ट कार्यान्वित करा

वैशिष्ट्य फाइलमध्ये, आमच्याकडे जावास्क्रिप्ट देखील चालविण्याची क्षमता आहे

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

उपरोक्त कोड 10 लांबीची यादृच्छिक स्ट्रिंग व्युत्पन्न करतो आणि त्यास सेशन आयड नावाच्या व्हेरिएबलमध्ये सेव्ह करतो.

डेटा चालवल्या चाचण्या

कराटे काकडीच्या शीर्षस्थानी बसले असल्याने, डेटा-आधारित चाचणी डीफॉल्ट म्हणून येते

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

वरील उदाहरण डेटा-आधारित चाचण्या तयार करण्यासाठी काकडीच्या परिदृश्य रूपरेषा आणि उदाहरण कीवर्डचा वापर करते. प्रत्येक पॅरामीटर वाचण्यासाठी, आम्ही कोन कंस वापरतो

वैशिष्ट्य फायलीवरून जावा कॉल करा

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

उपरोक्त वैशिष्ट्य फाईल | _ _ + _ | नावाच्या वर्गात जावा पद्धतीला कॉल करते. नंतर त्या कॉलचा प्रतिसाद ऑटपीकोड व्हेरिएबलला सेव्ह करते.