کراٹے API ٹیسٹنگ ٹول دھوکہ دہی

کراٹے ایک اوپن سورس API ٹیسٹنگ ٹول ہے جس کے ذریعہ تیار کیا گیا ہے پیٹ تھامس انٹیوٹ سے۔ کراٹے ایچ ٹی پی پلیئینٹ اور ککڑی کے اوپری حصے پر بنایا گیا ہے اور API ٹیسٹنگ کو بہت آسان بنانے کے لئے اس کا اپنا ڈی ایس ایل ہے۔ اگرچہ لگ بھگ ایک سال سے گزر رہا ہے ، یہ بہت تیزی سے پختہ ہوچکا ہے اور اس میں API جانچ کے آلے سے تمام توقعات کی توقع کی گئی ہے۔

کیونکہ کراٹے ککڑی کے اوپری حصے پر بیٹھے ہیں ، اس سے ککڑی کی ساری خصوصیات وراثت میں ملتی ہیں ، لہذا آپ اپنے API کے ٹیسٹ کو دیئے گئے جب آسان بنائے جاتے ہیں تو لکھ سکتے ہیں اور ککڑی کے تمام مطلوبہ الفاظ جیسے فیچر ، منظر نامہ ، منظر نامہ ، مثالوں ، فیچر ٹیگنگ کا استعمال کرسکتے ہیں۔

میں نے یہ دھوکہ دہی شیٹ کسی ایسے شخص کی مدد کے لئے بنائی ہے جو APIs کی جانچ میں شامل ہو ، اس کی مثال دیتے ہوئے کہ کراٹے کے آلے کو کس طرح استعمال کیا جائے۔


براہ مہربانی نوٹ کریں ، یہ دھوکہ دہی کی چادر آئس برگ کا صرف سرہ ہے۔ کراٹے میں بہت سی دوسری خصوصیات ہیں جن کا ذکر یہاں نہیں کیا گیا ہے۔ یہ فہرست عام طور پر عام طور پر استعمال کی جانے والی کاروائیوں میں سے ہوتی ہے جب عام طور پر API کی جانچ کرتے ہیں۔

انحصار شامل کریں (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

پروجیکٹ کی ساخت

آپ اپنے maven پروجیکٹ کو اس طرح سے منظم اور تشکیل دے سکتے ہیں۔


کراٹے- config.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; }

HTTP درخواست کیسے بھیجیں (حاصل کریں ، پوسٹ کریں ، رکھیں ، حذف کریں ، پیچ)

@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 ’کسی متغیر میں کسی قدر کو ذخیرہ کرنے کے لئے استعمال ہوتا ہے۔


ہیڈر ، یو آر ایل ، درخواست ، طریقہ ، حالت ، جواب DSL تشکیل دینے والے تمام کراٹے کے کلیدی الفاظ ہیں۔ کلیدی الفاظ کی مکمل فہرست کے ل Int ، انٹیوٹ دیکھیں۔

مندرجہ بالا مثال میں ، جواب JSON فارمیٹ ہے ، لہذا ہم کراٹے کے بلٹ میں JsonPath اشارے کو جواب کی تجزیہ کے لئے استعمال کرسکتے ہیں۔

متعدد API کالوں کے ساتھ سلسلہ بندی کی درخواست کریں

karate-config.js

مذکورہ بالا مثال میں ، پہلی کال کی گئی ہے اور اس کے جواب سے authId کو پارس کیا گیا ہے اور اسے متغیر میں محفوظ کیا گیا ہے جسے authId کہتے ہیں۔ اس کے بعد ہم پہلی کال میں دوبارہ حاصل شدہ مصنف ایڈ کے ساتھ دوسرا پے لوڈ کو تبدیل کرتے ہیں۔ اس کے بعد ہم اگلے 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

نوٹ ، مندرجہ بالا مثال میں ، ہم پوسٹ باڈی کی درخواست کے بطور ’__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 متغیر کے طور پر اسٹور کرتا ہے جسے MyReq کہا جاتا ہے

پھر ہم کال میتھڈ کا استعمال کرکے 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 کی ہونی چاہئے ، لہذا متغیر ای میل ایڈریس ایک درست JSON ہونا ضروری ہے۔

تب ہم کال کے طریقہ کار کا استعمال کرتے ہوئے 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' کے طور پر ٹیگ کیا گیا ہے۔

یہ ٹیسٹ رنز کے نتائج کو دیکھنے کے ل a ککڑی کی رپورٹ بھی تیار کرتا ہے۔

کمانڈ لائن یا سی آئی سے ٹیسٹ چلائیں

emailAddress

یہاں ، ہم TestRunner_FR کلاس چلا رہے ہیں اور ماحول کو اسٹیجنگ کے طور پر مرتب کررہے ہیں۔

فیچر فائل میں جاوا اسکرپٹ کو نافذ کریں

ایک فیچر فائل میں ، ہمارے پاس جاوا اسکرپٹ کو بھی چلانے کی صلاحیت ہے

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

مندرجہ بالا مثال ککڑی کے منظر نامے اور مثال کے الفاظ کو ڈیٹا سے چلنے والے ٹیسٹ بنانے کے لizes استعمال کرتی ہے۔ ہر پیرامیٹر کو پڑھنے کے ل we ، ہم اینگل بریکٹ کا استعمال کرتے ہیں

فیچر فائل سے جاوا کو کال کریں

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

مندرجہ بالا فیچر فائل کلاس میں جاوا کے طریقہ کار کو کال کرتی ہے۔ package com.example; public class StringUtil {
public static String getNumberFromString(String text) {
return text.replaceAll('\D+', '');
} }
اس کے بعد اس کال کے جواب کو otpCode متغیر پر بچاتا ہے۔