behat ट्यूटोरियल
बीहट से शुरुआत हो रही है
खोज…
टिप्पणियों
इस खंड में यह बताया गया है कि बीहट क्या है और एक डेवलपर इसका उपयोग क्यों करना चाहता है।
इसमें बेहट के भीतर किसी भी बड़े विषयों का उल्लेख होना चाहिए, और संबंधित विषयों को लिंक करना चाहिए। चूंकि बीहट के लिए दस्तावेज़ीकरण नया है, इसलिए आपको उन संबंधित विषयों के प्रारंभिक संस्करण बनाने की आवश्यकता हो सकती है।
उपयोगकर्ता कहानियों के रूप में कार्यात्मक परीक्षण
कार्यात्मक परीक्षण सबसे अच्छा आपके उपयोगकर्ता कहानियों के लिए परीक्षण के रूप में वर्णित हैं। यदि आपने सामान्य रूप से निम्नलिखित पैटर्न का पालन करने से पहले उपयोगकर्ता कहानियों से निपटा है:
As a [role], I want to [desire], so that [benefit/desired outcome]
निम्नलिखित उदाहरणों के लिए हम एक उदाहरण के रूप में इस उपयोगकर्ता कहानी का उपयोग करेंगे:
As a Dungeon Master, I want to ensure harmony and mutual trust, so that
the party can work together as a team
PHP में कार्यात्मक परीक्षण के लिए दो सबसे लोकप्रिय परीक्षण चौखटे हैं Behat और PHPSpec ।
शुरुआत बीहट से हुई
Behat Gherkin सिंटैक्स प्रदान करता है जो एक मानव-पठनीय प्रारूप है। यह आपको आसानी से अपनी उपयोगकर्ता कहानियों का वर्णन करने की अनुमति देता है।
Behat से शुरू करने के लिए आपको इसे संगीतकार के साथ स्थापित करना चाहिए और फिर अपनी परीक्षण फ़ाइलों को इनिशियलाइज़ करना चाहिए:
$ composer require --dev behat/behat="^3.0.5"
$ ./vendor/bin/behat --init
+d features # place your *.feature files here
+d features/bootstrap # place your context classes here
+f features/bootstrap/FeatureContext.php # place your definitions, transformations and hooks here
डिफ़ॉल्ट रूप से आप अपनी परीक्षण फ़ाइलों को features/
फ़ोल्डर में रखते हैं और एक्सटेंशन .feature
।
प्रत्येक परीक्षण फ़ाइल को एप्लिकेशन की एक विशेष सुविधा को परिभाषित करना चाहिए। एक सुविधा को परिदृश्यों के एक समूह में तोड़ दिया जाता है और इसमें कई चरणों की एक श्रृंखला होती है, जिन्हें पारित होने के लिए सफलतापूर्वक प्रदर्शन करने की आवश्यकता होती है। प्रत्येक परिदृश्य को पारित करने के लिए एक सुविधा के लिए पास करने की आवश्यकता होती है।
# features/PartyHarmony.feature
Feature: Party Harmony
As a Dungeon Master, I want to ensure harmony and mutual trust, so that
the party can work together as a team
Scenario: Teach members to respect each others property
Given that the Wizard has 10 cookies
And the Bard eats 1 cookie
Then the Bard is mysteriously on fire
अपने परीक्षण चलाने के लिए, आप सीधे बीहट बाइनरी निष्पादित करते हैं। हम वैकल्पिक रूप से निर्दिष्ट कर सकते हैं कि कौन सी फ़ाइल को चलाना है (अन्यथा सभी परीक्षण चलाए जाते हैं)। यह सुविधा फ़ाइल अपरिभाषित चरणों की त्रुटियों के साथ विफल हो जाएगी (क्योंकि हमने परिभाषित नहीं किया है कि उन चरणों का क्या मतलब है):
$ ./vendor/bin/behat features/PartyHarmony.feature
Feature: Party Harmony
As a Dungeon Master, I want to ensure harmony and mutual trust, so that
the party can work together as a team
Scenario: Teach members to respect each others property # features/PartyHarmony.feature:6
Given that the Wizard has 10 cookies
And the Bard eats 1 cookie
Then the Bard is mysteriously on fire
1 scenario (1 undefined)
3 steps (3 undefined)
0m0.01s (10.49Mb)
--- FeatureContext has missing steps. Define them with these snippets:
/**
* @Given that the Wizard has :arg1 cookies
*/
public function thatTheWizardHasCookies($arg1)
{
throw new PendingException();
}
/**
* @Given the Bard eats :arg1 cookie
*/
public function theBardEatsCookie($arg1)
{
throw new PendingException();
}
/**
* @Then the Bard is mysteriously on fire
*/
public function theBardIsMysteriouslyOnFire()
{
throw new PendingException();
}
परिदृश्य में प्रत्येक चरण एक संदर्भ PHP फ़ाइल से कोड का एक टुकड़ा चलाता है (विभिन्न फीचर परीक्षण अलग संदर्भ लोड कर सकते हैं)। हम Behat द्वारा सुझाए गए उदाहरणों की प्रतिलिपि बना सकते हैं या अपने स्वयं के बना सकते हैं। कदम को एक नियमित अभिव्यक्ति जांच से मिलान किया जाता है। इसलिए अगर हम अमल करें
<?php
#
class FeatureContext {
/**
* @Given that the wizard has :num cookies
*/
public function wizardHasCookies($num) {
// $this->wizard is a pre-existing condition.... like syphilis
$this->wizard->setNumberOfCookies($num);
}
/**
* @Given the Bard eats :num cookie
*/
public function theBardEatsCookie($num)
{
$this->bard->consumeCookies($num);
}
/**
* @Then the Bard is mysteriously on fire
*/
public function theBardIsMysteriouslyOnFire() {
PHPUnit_Framework_Assert::assertTrue(
$this->bard->isBardOnFire()
);
}
}
आप PHPUnit_Framework_Assert
के उपयोग पर ध्यान देंगे। Behat में यह स्वयं का मुखर सिस्टम नहीं है जिससे आप जो चाहें उपयोग कर सकते हैं।
अब परीक्षण चलाने से वास्तविक कोड निष्पादित होगा और यदि सब कुछ गुजरता है तो हम परीक्षण कर सकते हैं:
$ ./vendor/bin/behat features/PartyHarmony.feature
Feature: Party Harmony
As a Dungeon Master, I want to ensure harmony and mutual trust, so that
the party can work together as a team
Scenario: Teach members to respect each others property # features/PartyHarmony.feature:6
Given that the Wizard has 10 cookies # FeatureContext::thatTheWizardHasCookies()
And the Bard eats 1 cookie # FeatureContext::theBardEatsCookie()
Then the Bard is mysteriously on fire # FeatureContext::theBardIsMysteriouslyOnFire()
1 scenario (1 passed)
3 steps (3 passed)
0m0.01s (10.59Mb)
मिंक के साथ बेहट का विस्तार
मिंक वेब ड्राइवरों (जैसे गाउट और सेलेनियम) के लिए एक इंटरफ़ेस प्रदान करता है और साथ ही एक MinkContext
भी, जो विस्तारित होने पर, हमारे चरणों के लिए अतिरिक्त वेब भाषा प्रदान करता है।
मिंक स्थापित करने के लिए (और डिफ़ॉल्ट Goutte ड्राइवर):
$ composer require --dev behat/mink-extension="^2.0"
$ composer require --dev behat/mink-goutte-driver="^1.0"
फिर MinkContext
साथ अपने संदर्भ का विस्तार करें:
<?php
use Behat\MinkExtension\Context\MinkContext;
class FeatureContext extends MinkContext … {
…
}
आप अपने Behat में उपलब्ध सिंटैक्स की पूरी सूची निम्न कमांड के साथ देख सकते हैं:
$ ./vendor/bin/behat -dl
Given /^(?:|I )am on "(?P<page>[^"]+)"$/
When /^(?:|I )reload the page$/
When /^(?:|I )move backward one page$/
When /^(?:|I )move forward one page$/
When /^(?:|I )press "(?P<button>(?:[^"]|\\")*)"$/
When /^(?:|I )follow "(?P<link>(?:[^"]|\\")*)"$/
When /^(?:|I )fill in "(?P<field>(?:[^"]|\\")*)" with "(?P<value>(?:[^"]|\\")*)"$/
फिर आपको यह इंगित करने के लिए मिंक को कॉन्फ़िगर करने की आवश्यकता है कि आप जिस वेबसाइट का परीक्षण करना चाहते हैं वह कहाँ स्थित है और कौन से वेब ड्राइवर का उपयोग करना है (डिफ़ॉल्ट रूप से Goutte):
# ./behat.yml
default:
extensions:
Behat\MinkExtension:
base_url: "[your website URL]"
sessions:
default:
goutte: ~
यहां केवल मिंक प्रदान किए गए चरणों का उपयोग करके परिदृश्य का एक उदाहरण दिया गया है:
# ./features/Authentication.feature
Feature: Authentication
As a security conscious developer I wish to ensure that only valid users can access our website.
Scenario: Login in successfully to my website
When I am on "/login"
And I fill in "email" with "[email protected]"
And I fill in "password" with "my_password"
And I press "Login"
Then I should see "Successfully logged in"
Scenario: Attempt to login with invalid credentials
When I am on "/login"
And I fill in "email" with "[email protected]"
And I fill in "password" with "not_my_password"
And I press "Login"
Then I should see "Login failed"
अब आप Behat के माध्यम से इस सुविधा को चलाकर इसका परीक्षण कर सकते हैं:
./vendor/bin/behat features/Authentication.feature
आप सामान्य चरणों के लिए MinkContext
का उपयोग करके अपने स्वयं के कदम बना सकते हैं (उदाहरण के लिए लॉगिंग एक बहुत ही सामान्य ऑपरेशन है):
Feature: Authentication
As a security conscious developer I wish to ensure that only valid users can access our website.
Scenario: Login in successfully to my website
Given I login as "[email protected]" with password "my_password"
Then I should see "Successfully logged in"
Scenario: Attempt to login with invalid credentials
Given I login as "[email protected]" with password "not_my_password"
Then I should see "Login failed"
वेब ड्राइवरों और पेज इंटरैक्शन तक पहुंचने के लिए आपको अपनी संदर्भ फ़ाइल को MinkContext
साथ विस्तारित करने की आवश्यकता होगी:
<?php
use Behat\MinkExtension\Context\MinkContext;
class FeatureContext extends MinkContext {
/**
* @Given I login as :username with password :password
*/
public function iLoginAsWithPassword($username, $password) {
$this->visit("/login");
$this->fillField("email", $username);
$this->fillField("password", $password);
$this->pressButton("Login");
}
}
मिंक ज्यादातर पूर्व-प्रदान की गई कॉलों में सीएसएस चयनकर्ताओं को प्रदान करता है जो आपको इस तरह के निर्माणों का उपयोग करके पृष्ठ पर तत्वों की पहचान करने की अनुमति देता है:
When I click on "div[id^='some-name']"
And I click on ".some-class:first"
And I click on "//html/body/table/thead/tr/th[first()]"
मिंक और सेलेनियम के साथ परीक्षण जावास्क्रिप्ट
यदि हम किसी वेबसाइट पर जावास्क्रिप्ट का परीक्षण करना चाहते हैं, तो हमें Goutte की तुलना में कुछ अधिक शक्तिशाली का उपयोग करने की आवश्यकता होगी (जो कि गुज़ल के माध्यम से सिर्फ cURL है)। कुछ विकल्प हैं जैसे कि ज़ोंबीजेएस , सेलेनियम और साही । इस उदाहरण के लिए मैं सेलेनियम का उपयोग करूँगा।
पहले आपको मिंक के लिए ड्राइवरों को स्थापित करना होगा:
$ composer require --dev behat/mink-selenium2-driver="^1.2"
और आपको सेलेनियम स्टैंडअलोन सर्वर जार फ़ाइल डाउनलोड करने और इसे शुरू करने की आवश्यकता होगी:
$ java -jar selenium-server-standalone-2.*.jar
हमें @javascript
को यह भी बताना होगा कि जब हम सेलेनियम चालक का उपयोग करने के लिए @javascript
टैग का उपयोग करते हैं और सेलेनियम स्टैंडअलोन सर्वर का स्थान प्रदान करते हैं।
# ./behat.yml
default:
# …
extensions:
Behat\MinkExtension:
base_url: "[your website URL]"
sessions:
# …
javascript:
selenium2:
browser: "firefox"
wd_host: http://localhost:4444/wd/hub
फिर, प्रत्येक परीक्षण के लिए जिसे आप ब्राउज़र एमुलेशन का उपयोग करके चलाना चाहते हैं, आपको केवल सुविधा या परिदृश्य की शुरुआत में एक @javascript
(या @selenium2
) टैग जोड़ने की आवश्यकता है।
# ./features/TestSomeJavascriptThing.feature
@javascript # or we could use @selenium2
Feature: This test will be run with browser emulation
परीक्षण को बेहट (किसी भी अन्य परीक्षण के रूप में) के माध्यम से चलाया जा सकता है। एक अंतर यह है कि जब परीक्षण चलाया जाता है, तो उसे सेलेनियम स्टैंडअलोन सर्वर चलाने वाले कंप्यूटर पर एक ब्राउज़र विंडो को स्पॉन करना चाहिए जो तब वर्णित परीक्षणों का प्रदर्शन करेगा।
परीक्षण डेटा सेट करना
कार्यात्मक परीक्षण डेटा के साथ अक्सर संशोधित किया जाता है। यह परीक्षण सूट के बाद के रनों को विफल करने का कारण बन सकता है (जैसा कि मूल स्थिति से डेटा बदल सकता था)।
यदि आपने ORM या फ़्रेमवर्क का उपयोग करके अपने डेटा स्रोत को सेटअप किया है जो माइग्रेशन या सीडिंग (जैसे Doctrine , Propel , Laravel ) का समर्थन करता है, तो आप प्रत्येक परीक्षण रन पर फ़िक्चर डेटा के साथ एक नया परीक्षण डेटाबेस बनाने के लिए इसका उपयोग कर सकते हैं।
यदि आप वर्तमान में इनमें से किसी एक (या समतुल्य) का उपयोग नहीं करते हैं, तो आप फिनेक्स जैसे टूल का उपयोग करके एक नए टेस्ट डेटाबेस को जल्दी से सेट कर सकते हैं या प्रत्येक टेस्ट रन के लिए एक मौजूदा डेटाबेस तैयार कर सकते हैं (टेस्ट प्रविष्टियों को साफ कर सकते हैं, डेटा को मूल स्थिति में वापस सेट कर सकते हैं। )।
# Install Phinx in your project
$ php composer.phar require robmorgan/phinx
$ php vendor/bin/phinx init
Phinx by Rob Morgan - https://phinx.org. version x.x.x
Created ./phinx.xml
अपने डेटाबेस क्रेडेंशियल को ./phinx.xml
जोड़ें।
$ php vendor/bin/phinx create InitialMigration
आप निर्दिष्ट कर सकते हैं कि आपके डेटाबेस तालिकाओं को कैसे बनाया गया है और प्रलेखन में प्रदान किए गए सिंटैक्स का उपयोग करके आबादी है।
फिर, हर बार जब आप अपने परीक्षण चलाते हैं तो आप इस तरह से एक स्क्रिप्ट चलाते हैं:
#!/usr/bin/env bash
# Define the test database you'll use
DATABASE="test-database"
# Clean up and re-create this database and its contents
mysql -e "DROP DATABASE IF EXISTS $DATABASE"
mysql -e "CREATE DATABASE $DATABASE"
vendor/bin/phinx migrate
# Start your application using the test database (passed as an environment variable)
# You can access the value with $_ENV['database']
database=$DATABASE php -d variables_order=EGPCS -S localhost:8080
# Run your functional tests
vendor/bin/behat
डेटा परिवर्तन के कारण अब आपके कार्यात्मक परीक्षण विफल नहीं होने चाहिए।
ईमेल कैप्चर करना
कार्यात्मक परीक्षण में परीक्षण प्रक्रियाएं भी शामिल हो सकती हैं जो आपके वातावरण को छोड़ देती हैं, जैसे बाहरी एपीआई कॉल और ईमेल।
एक उदाहरण के रूप में, कल्पना कीजिए कि आप अपनी वेबसाइट के लिए पंजीकरण प्रक्रिया का कार्यात्मक परीक्षण कर रहे हैं। इस प्रक्रिया के अंतिम चरण में सक्रियण लिंक के साथ एक ईमेल भेजना शामिल है। इस लिंक पर जाने तक, खाता पूरी तरह से पंजीकृत नहीं है। आप दोनों का परीक्षण करना चाहते हैं:
- यह ईमेल सही ढंग से भेजा जाएगा (स्वरूपण, प्लेसहोल्डर प्रतिस्थापन, आदि) और,
- यह सक्रियण लिंक काम करता है
अब आप ईमेल भेजने का परीक्षण कर सकते हैं लेकिन मेलबॉक्स से भेजे गए ईमेल को पुनः प्राप्त करने के लिए एक IMAP या POP क्लाइंट का उपयोग कर सकते हैं, लेकिन इसका अर्थ है कि आप अपने इंटरनेट कनेक्शन, दूरस्थ ईमेल सर्वर और डिलीवरी में उत्पन्न होने वाली समस्याओं (स्पैम का पता लगाने) का परीक्षण कर रहे हैं उदाहरण के लिए)।
एक सरल समाधान एक स्थानीय सेवा का उपयोग करना है जो एसएमटीपी कनेक्शनों से बाहर निकलता है और डिस्क को भेजे गए ईमेल को डंप करता है।
कुछ उदाहरण हैं:
smtp- सिंक - एक उपयोगिता प्रोग्राम जो पोस्टफिक्स के साथ बंडल में आता है।
# Stop the currently running service
sudo service postfix stop
# Dumps outgoing emails to file as "day.hour.minute.second"
smtp-sink -d "%d.%H.%M.%S" localhost:2500 1000
# Now send mails to your local SMTP server as normal and they will be
# dumped to raw text file for you to open and read
# Run your functional tests
vendor/bin/behat
smtp-sink
को मारना न भूलें और बाद में अपनी पोस्टफ़िक्स सेवा को फिर से शुरू करें:
# Restart postfix
sudo service postfix start
FakeSMTP - एक जावा-आधारित क्लाइंट जो आउटगोइंग मेल को फंसाता है
# -b = Start without GUI interface
# -o = Which directory to dump your emails to
$ java -jar fakeSMTP.jar -b -o output_directory_name
वैकल्पिक रूप से आप एक दूरस्थ सेवा का उपयोग कर सकते हैं जो मेलट्रैप जैसी सेवा प्रदान करती है लेकिन तब आपका परीक्षण इंटरनेट एक्सेस पर निर्भर होता है।
स्थापना या सेटअप
Behat / मिंक
संगीतकार का उपयोग करके स्थापित करें (अन्य विधियों की जांच के लिए) behat.org यदि आप लिनक्स का उपयोग कर रहे हैं, तो कृपया सुनिश्चित करें कि आपने php-curl स्थापित किया है (सामान्य कर्ल इंस्टॉलेशन काम नहीं करेगा)
लिनक्स
sudo apt-get install php5-curl
यदि आप विंडोज का उपयोग कर रहे हैं, तो सुनिश्चित करें कि आपके पास PHP, कर्ल और गिट स्थापित हैं। आप निम्नलिखित लिंक के तहत उन पा सकते हैं:
- PHP (Xampp): https://www.apachefriends.org/de/index.html
- कर्ल: http://curl.haxx.se/latest.cgi?curl=win64-nossl
- Git: http://git-scm.com/download/win
आपके कंपोजर.जॉन में निम्नलिखित शामिल होंगे:
बेहट - संगीतकार
{
"require": {
"behat/behat": "dev-master",
"behat/mink": "dev-master",
"behat/mink-extension": "dev-master",
"behat/mink-selenium2-driver": "dev-master",
"phpunit/php-code-coverage": "dev-master",
"phpunit/phpunit-mock-objects": "dev-master",
"phpunit/phpunit": "dev-master"
},
"minimum-stability": "dev",
"config": {
"bin-dir": "bin/"
}
}
(जब विंडोज में कंपोजर.जॉसन फाइल को सेव करते हैं, तो आपको "सभी फाइल" को फाइलपेप और "एएनएसआई" कोड के रूप में चुनना होगा)
बाद में निम्नलिखित कमांड निष्पादित करें:
$ curl http://getcomposer.org/installer | php
$ php composer.phar install
इसके बाद बेहट, मिंक और बिहट-मिंक एक्सटेंशन स्थापित किए जाते हैं, बीहट को निष्पादित करने के लिए
अमल करो
$ bin/behat
Behat-Mink Extension उपयोग को सक्रिय करने के लिए: behat.yml निम्नलिखित सामग्री के साथ एक फ़ाइल "behat.yml" बनाएं।
behat.yml
default:
suites:
default:
paths:
features: %paths.base%/features/
bootstrap: %paths.base%/features/bootstrap/
contexts:
- FeatureContext
extensions:
Behat\MinkExtension:
base_url: 'http://www.startTestUrl.de'
selenium2:
browser: firefox
wd_host: "http://localhost:4444/wd/hub"
यह फाइल उसी डायरेक्टरी में होगी जिसमें बिन डायरेक्टरी और बीहट का लिंक होगा।
यह भी ध्यान दें कि yml फ़ाइल में, इंडेंटेशन के लिए टैब का उपयोग न करें। रिक्त स्थान का उपयोग करें। बेहट-मिंक में उपलब्ध आदेशों की एक सूची प्राप्त करने के लिए, उपयोग करें
$ bin/behat -di
अपने सिस्टम का हिस्सा बनें
लिनक्स
अपने होमडायरेक्टरी पर जाएं और निम्न कार्य करें:
$ sudo vi .bashrc
और डायरेक्टरी के अंत में इस लाइनों को जोड़ें
export BEHAT_HOME=/home/*user*/path/to/behat
export PATH=$BEHAT_HOME/bin:$PATH
कंसोल को पुनरारंभ करें या "स्रोत .bashrc" टाइप करें
खिड़कियाँ
Systemettings पर जाएँ और पर्यावरण-चर के लिए behat / bin का पथ जोड़ें
अन्य ड्राइवर्स ओवर ड्राइवर जैसे सेलेनियम, फैंटमज, गाउट, आदि को भी स्थापित किया जाना चाहिए।