This repository was archived by the owner on Dec 13, 2023. It is now read-only.

Repository files navigation


Behat and CBT

Behat is a Behavior Driven Development test framework for PHP. The power of Behat, and BDD in general, is that your tests define how your application should behave in different scenarios. More than just confirming that parts of your application work, BDD helps define and clarify the overall design of your application. And since Behat/BDD tests are writen in plain English, they can be understood by devs, managers, marketers, and everyone else involved with your application.

Getting set up

This example is for Behat 2, if you are using Behat 3, please look at our Behat3 Example

Installing Composer

First, make sure you have PHP Dependency Manager Composer installed. Follow the instructions on their download page to install it.

Installing Behat

Once you have Composer, the easiest way to get set up would be to clone this repository, then run composer install to install the modules listed in composer.json (and their dependencies).

Setting up conf.yml files

In order to run any tests, you'll need to make a few changes to the configuration files located in config/.

In order to run tests, you'll need a valid credentials, so set user to the email address associated with your crossbrowsertesting.com account, and set key to your authkey. The easiest way to find your authkey by going to your account page.

You can also change the capabilities and browers keys to rename/re-version your test, extend the max_duration, or change your target browser(s).

To find the os_api_name and browser_api_name that correspond to your targeted platform, you can either go to CrossBrowserTesting's Selenium Page, open the wizard, and watch the capabilities in the sample script change as you select different browers, OR you can parse the os/browser you want out of the JSON response from https://crossbrowsertesting.com/api/v3/selenium/browsers

If you run into any trouble or have any questions, send an email to info@crossbrowsertesting.com.

Writing tests

Now that the environment is set up, we can start actually writing tests. There are two main steps to writing test with Behat: define application behavior as scenarios and steps, then code each step as a function.

Defining behavior in *.feature files

Accurately and concisely describing application behavior is the core of BDD. Behat (and most other BDD frameworks) use the Gherkin language to write real automated tests in plain English.

Let's walk through writing a couple simple tests for our example login page. It's a simple page, so our tests won't be very long.

Let's start by defining what our feature is in features/login.feature

Feature: Login to page As a user I should be able to log in If I supply valid user credentials

Simple enough. The whole block will be displayed at the start of the test, so make sure that it says something useful.

Next, we define how our application should behave in different scenarios. For this simple login page there are only two scenarios we need to test: a valid login, and an invalid login.

Scenario: Login with bad credentialsGiven I go to "http://crossbrowsertesting.github.io/login-form.html"When I fill in "#username" with "badusername@crossbrowsertesting.com"And I fill in "#password" with "badpassword"And I press ".form-actions > button"Then I should see ".alert-danger" say "Username or password is incorrect"Scenario: Login with good credentialsGiven I go to "http://crossbrowsertesting.github.io/login-form.html"When I fill in "#username" with "tester@crossbrowsertesting.com"And I fill in "#password" with "test123"And I press ".form-actions > button"Then I should see "#logged-in-message>p" say "You are now logged in!"

As you can see, we use plain english to describe the setup (being on the right page), the actions for the test (filling in username and password then clicking the login button), and the desired outcome (the message we see).

The Gherkin language can handle some very complicated test logic, so I recommend taking a look at Behat's official guide to writing features with Gherkin.

Coding steps in the FeatureContext.php file

Now that our feature is defined, we can run our tests with $ bin/behat.

You should see an output like this:

2 scenarios (2 undefined)
10 steps (10 undefined)
0m0.011s
You can implement step definitions for undefined steps with these snippets:
/**
* @Given /^I go to "([^"]*)"$/
*/
public function iGoTo($arg1)
{
throw new PendingException();
}
[...]

So, we can see that Behat parsed login.feature but wasn't able to find functions in features/bootstrap/FeatureContext.php to tell it how to execute each step.

But we can copy the functions it generates and paste them into our FeatureContext.php file to give us a starting place.

The comment above each function describes the Regex that it uses to link steps in the login.feature file to the function, as well as how arguments get passed from the step to the function.

Now we just have to write some Selenium code to define each step! This isn't a Selenium guide, so I'll just point you towards Facebook's excellent documentation. If you encounter any trouble, be sure to shoot an email to info@crossbrowsertesting.com and we'll be able to give you a hand.

Running tests

Now that everything is set up, let's try running the test!

$ bin/behat -c config/single.conf.yml
Feature: Test a login form
Scenario: Login with bad credentials # /Users/johnreese/Google Drive/CBT/repos/behat/features/single/login.feature:3
Given I go to "http://crossbrowsertesting.github.io/login-form.html" # FeatureContext::iGoTo()
When I fill in "#username" with "badusername@crossbrowsertesting.com" # FeatureContext::iFillInWith()
And I fill in "#password" with "badpassword" # FeatureContext::iFillInWith()
And I press ".form-actions > button" # FeatureContext::iPress()
Then I should see ".alert-danger" say "Username or password is incorrect" # FeatureContext::iShouldSeeSay()
Scenario: Login with good credentials # /Users/johnreese/Google Drive/CBT/repos/behat/features/single/login.feature:10
Given I go to "http://crossbrowsertesting.github.io/login-form.html" # FeatureContext::iGoTo()
When I fill in "#username" with "tester@crossbrowsertesting.com" # FeatureContext::iFillInWith()
And I fill in "#password" with "test123" # FeatureContext::iFillInWith()
And I press ".form-actions > button" # FeatureContext::iPress()
Then I should see "#logged-in-message>p" say "You are now logged in!" # FeatureContext::iShouldSeeSay()
2 scenarios (2 passed)
10 steps (10 passed)
0m43.527s

Success!

Parallel execution

But how can we run the test on multiple browsers at once? Easy! This repo includes a file called run-parallel.php which can help manage parallel execution across multiple browsers at once.

I've included a configuration file that will run tests on IE8 through IE11 as well as Edge called ie.conf.yml. It is identical to single.conf.yml, except that it lists more than one browser.

To start the test, just run our helper file like this:

$ php run-parallel.php -c config/ie.conf.yml

Websites behind your firewall

If you have our Node module cbt_tunnels installed, you can run tests to websites behind your firewall by running run-parallel.php with the -l flag.

If you don't have cbt_tunnels installed, you can install it by running $ npm install -g cbt_tunnels.

Help!

If you got stuck, or something doesn't make sense, don't worry! Just shoot an email to info@crossbrowsertesting.com and we'll help you out.

Happy testing!

About

A quick guide to using Behat with CBT

Resources

Stars

4 stars

Watchers

0 watching

Forks

Releases

Packages

Contributors

Languages

, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Add copy buttons to all
 blocks\n(function() {\n function addCopyButtons() {\n document.querySelectorAll('pre code').forEach(function(codeBlock) {\n if (codeBlock.parentElement.hasAttribute('data-copy-added')) return;\n codeBlock.parentElement.setAttribute('data-copy-added', 'true');\n \n var btn = document.createElement('button');\n btn.textContent = 'Copy';\n btn.style.cssText = 'position:absolute;top:4px;right:4px;padding:2px 8px;font-size:11px;background:#4ecdc4;border:none;border-radius:4px;color:#1a1a2e;cursor:pointer;opacity:0.7;transition:opacity 0.2s;';\n btn.onmouseover = function() { this.style.opacity = '1'; };\n btn.onmouseout = function() { this.style.opacity = '0.7'; };\n btn.onclick = function() {\n navigator.clipboard.writeText(codeBlock.textContent).then(function() {\n btn.textContent = 'Copied!';\n setTimeout(function() { btn.textContent = 'Copy'; }, 1500);\n });\n };\n codeBlock.parentElement.style.position = 'relative';\n codeBlock.parentElement.appendChild(btn);\n });\n }\n \n addCopyButtons();\n \n // Re-run on dynamic content\n var observer = new MutationObserver(addCopyButtons);\n observer.observe(document.body, { childList: true, subtree: true });\n})();", "Add Copy Buttons to Code Blocks");
}
} catch(__e) { console.warn('[Userscript:Add Copy Buttons to Code Blocks]', __e); }
})();
(function(){
try {
var __m = "github.com";
var __re = new RegExp('^' + "github\\.com" + '
Skip to content
This repository was archived by the owner on Dec 13, 2023. It is now read-only.

Repository files navigation


Behat and CBT

Behat is a Behavior Driven Development test framework for PHP. The power of Behat, and BDD in general, is that your tests define how your application should behave in different scenarios. More than just confirming that parts of your application work, BDD helps define and clarify the overall design of your application. And since Behat/BDD tests are writen in plain English, they can be understood by devs, managers, marketers, and everyone else involved with your application.

Getting set up

This example is for Behat 2, if you are using Behat 3, please look at our Behat3 Example

Installing Composer

First, make sure you have PHP Dependency Manager Composer installed. Follow the instructions on their download page to install it.

Installing Behat

Once you have Composer, the easiest way to get set up would be to clone this repository, then run composer install to install the modules listed in composer.json (and their dependencies).

Setting up conf.yml files

In order to run any tests, you'll need to make a few changes to the configuration files located in config/.

In order to run tests, you'll need a valid credentials, so set user to the email address associated with your crossbrowsertesting.com account, and set key to your authkey. The easiest way to find your authkey by going to your account page.

You can also change the capabilities and browers keys to rename/re-version your test, extend the max_duration, or change your target browser(s).

To find the os_api_name and browser_api_name that correspond to your targeted platform, you can either go to CrossBrowserTesting's Selenium Page, open the wizard, and watch the capabilities in the sample script change as you select different browers, OR you can parse the os/browser you want out of the JSON response from https://crossbrowsertesting.com/api/v3/selenium/browsers

If you run into any trouble or have any questions, send an email to info@crossbrowsertesting.com.

Writing tests

Now that the environment is set up, we can start actually writing tests. There are two main steps to writing test with Behat: define application behavior as scenarios and steps, then code each step as a function.

Defining behavior in *.feature files

Accurately and concisely describing application behavior is the core of BDD. Behat (and most other BDD frameworks) use the Gherkin language to write real automated tests in plain English.

Let's walk through writing a couple simple tests for our example login page. It's a simple page, so our tests won't be very long.

Let's start by defining what our feature is in features/login.feature

Feature: Login to page As a user I should be able to log in If I supply valid user credentials

Simple enough. The whole block will be displayed at the start of the test, so make sure that it says something useful.

Next, we define how our application should behave in different scenarios. For this simple login page there are only two scenarios we need to test: a valid login, and an invalid login.

Scenario: Login with bad credentialsGiven I go to "http://crossbrowsertesting.github.io/login-form.html"When I fill in "#username" with "badusername@crossbrowsertesting.com"And I fill in "#password" with "badpassword"And I press ".form-actions > button"Then I should see ".alert-danger" say "Username or password is incorrect"Scenario: Login with good credentialsGiven I go to "http://crossbrowsertesting.github.io/login-form.html"When I fill in "#username" with "tester@crossbrowsertesting.com"And I fill in "#password" with "test123"And I press ".form-actions > button"Then I should see "#logged-in-message>p" say "You are now logged in!"

As you can see, we use plain english to describe the setup (being on the right page), the actions for the test (filling in username and password then clicking the login button), and the desired outcome (the message we see).

The Gherkin language can handle some very complicated test logic, so I recommend taking a look at Behat's official guide to writing features with Gherkin.

Coding steps in the FeatureContext.php file

Now that our feature is defined, we can run our tests with $ bin/behat.

You should see an output like this:

2 scenarios (2 undefined)
10 steps (10 undefined)
0m0.011s
You can implement step definitions for undefined steps with these snippets:
/**
* @Given /^I go to "([^"]*)"$/
*/
public function iGoTo($arg1)
{
throw new PendingException();
}
[...]

So, we can see that Behat parsed login.feature but wasn't able to find functions in features/bootstrap/FeatureContext.php to tell it how to execute each step.

But we can copy the functions it generates and paste them into our FeatureContext.php file to give us a starting place.

The comment above each function describes the Regex that it uses to link steps in the login.feature file to the function, as well as how arguments get passed from the step to the function.

Now we just have to write some Selenium code to define each step! This isn't a Selenium guide, so I'll just point you towards Facebook's excellent documentation. If you encounter any trouble, be sure to shoot an email to info@crossbrowsertesting.com and we'll be able to give you a hand.

Running tests

Now that everything is set up, let's try running the test!

$ bin/behat -c config/single.conf.yml
Feature: Test a login form
Scenario: Login with bad credentials # /Users/johnreese/Google Drive/CBT/repos/behat/features/single/login.feature:3
Given I go to "http://crossbrowsertesting.github.io/login-form.html" # FeatureContext::iGoTo()
When I fill in "#username" with "badusername@crossbrowsertesting.com" # FeatureContext::iFillInWith()
And I fill in "#password" with "badpassword" # FeatureContext::iFillInWith()
And I press ".form-actions > button" # FeatureContext::iPress()
Then I should see ".alert-danger" say "Username or password is incorrect" # FeatureContext::iShouldSeeSay()
Scenario: Login with good credentials # /Users/johnreese/Google Drive/CBT/repos/behat/features/single/login.feature:10
Given I go to "http://crossbrowsertesting.github.io/login-form.html" # FeatureContext::iGoTo()
When I fill in "#username" with "tester@crossbrowsertesting.com" # FeatureContext::iFillInWith()
And I fill in "#password" with "test123" # FeatureContext::iFillInWith()
And I press ".form-actions > button" # FeatureContext::iPress()
Then I should see "#logged-in-message>p" say "You are now logged in!" # FeatureContext::iShouldSeeSay()
2 scenarios (2 passed)
10 steps (10 passed)
0m43.527s

Success!

Parallel execution

But how can we run the test on multiple browsers at once? Easy! This repo includes a file called run-parallel.php which can help manage parallel execution across multiple browsers at once.

I've included a configuration file that will run tests on IE8 through IE11 as well as Edge called ie.conf.yml. It is identical to single.conf.yml, except that it lists more than one browser.

To start the test, just run our helper file like this:

$ php run-parallel.php -c config/ie.conf.yml

Websites behind your firewall

If you have our Node module cbt_tunnels installed, you can run tests to websites behind your firewall by running run-parallel.php with the -l flag.

If you don't have cbt_tunnels installed, you can install it by running $ npm install -g cbt_tunnels.

Help!

If you got stuck, or something doesn't make sense, don't worry! Just shoot an email to info@crossbrowsertesting.com and we'll help you out.

Happy testing!

About

A quick guide to using Behat with CBT

Resources

Stars

4 stars

Watchers

0 watching

Forks

Releases

Packages

Contributors

Languages

, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Force GitHub README to respect dark mode\n(function() {\n var style = document.createElement('style');\n style.textContent = '\n .markdown-body {\n color-scheme: dark light;\n }\n .markdown-body pre { background: #161b22 !important; }\n .markdown-body code { background: rgba(110, 118, 129, 0.4) !important; }\n .markdown-body table th, .markdown-body table td { border-color: #30363d !important; }\n .markdown-body img { background: #0d1117; }\n .markdown-body blockquote { border-left-color: #8b949e; }\n .markdown-body hr { border-color: #30363d; }\n ';\n document.head.appendChild(style);\n})();", "GitHub Dark Mode README Fix"); } } catch(__e) { console.warn('[Userscript:GitHub Dark Mode README Fix]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + '
Skip to content
This repository was archived by the owner on Dec 13, 2023. It is now read-only.

Repository files navigation


Behat and CBT

Behat is a Behavior Driven Development test framework for PHP. The power of Behat, and BDD in general, is that your tests define how your application should behave in different scenarios. More than just confirming that parts of your application work, BDD helps define and clarify the overall design of your application. And since Behat/BDD tests are writen in plain English, they can be understood by devs, managers, marketers, and everyone else involved with your application.

Getting set up

This example is for Behat 2, if you are using Behat 3, please look at our Behat3 Example

Installing Composer

First, make sure you have PHP Dependency Manager Composer installed. Follow the instructions on their download page to install it.

Installing Behat

Once you have Composer, the easiest way to get set up would be to clone this repository, then run composer install to install the modules listed in composer.json (and their dependencies).

Setting up conf.yml files

In order to run any tests, you'll need to make a few changes to the configuration files located in config/.

In order to run tests, you'll need a valid credentials, so set user to the email address associated with your crossbrowsertesting.com account, and set key to your authkey. The easiest way to find your authkey by going to your account page.

You can also change the capabilities and browers keys to rename/re-version your test, extend the max_duration, or change your target browser(s).

To find the os_api_name and browser_api_name that correspond to your targeted platform, you can either go to CrossBrowserTesting's Selenium Page, open the wizard, and watch the capabilities in the sample script change as you select different browers, OR you can parse the os/browser you want out of the JSON response from https://crossbrowsertesting.com/api/v3/selenium/browsers

If you run into any trouble or have any questions, send an email to info@crossbrowsertesting.com.

Writing tests

Now that the environment is set up, we can start actually writing tests. There are two main steps to writing test with Behat: define application behavior as scenarios and steps, then code each step as a function.

Defining behavior in *.feature files

Accurately and concisely describing application behavior is the core of BDD. Behat (and most other BDD frameworks) use the Gherkin language to write real automated tests in plain English.

Let's walk through writing a couple simple tests for our example login page. It's a simple page, so our tests won't be very long.

Let's start by defining what our feature is in features/login.feature

Feature: Login to page As a user I should be able to log in If I supply valid user credentials

Simple enough. The whole block will be displayed at the start of the test, so make sure that it says something useful.

Next, we define how our application should behave in different scenarios. For this simple login page there are only two scenarios we need to test: a valid login, and an invalid login.

Scenario: Login with bad credentialsGiven I go to "http://crossbrowsertesting.github.io/login-form.html"When I fill in "#username" with "badusername@crossbrowsertesting.com"And I fill in "#password" with "badpassword"And I press ".form-actions > button"Then I should see ".alert-danger" say "Username or password is incorrect"Scenario: Login with good credentialsGiven I go to "http://crossbrowsertesting.github.io/login-form.html"When I fill in "#username" with "tester@crossbrowsertesting.com"And I fill in "#password" with "test123"And I press ".form-actions > button"Then I should see "#logged-in-message>p" say "You are now logged in!"

As you can see, we use plain english to describe the setup (being on the right page), the actions for the test (filling in username and password then clicking the login button), and the desired outcome (the message we see).

The Gherkin language can handle some very complicated test logic, so I recommend taking a look at Behat's official guide to writing features with Gherkin.

Coding steps in the FeatureContext.php file

Now that our feature is defined, we can run our tests with $ bin/behat.

You should see an output like this:

2 scenarios (2 undefined)
10 steps (10 undefined)
0m0.011s
You can implement step definitions for undefined steps with these snippets:
/**
* @Given /^I go to "([^"]*)"$/
*/
public function iGoTo($arg1)
{
throw new PendingException();
}
[...]

So, we can see that Behat parsed login.feature but wasn't able to find functions in features/bootstrap/FeatureContext.php to tell it how to execute each step.

But we can copy the functions it generates and paste them into our FeatureContext.php file to give us a starting place.

The comment above each function describes the Regex that it uses to link steps in the login.feature file to the function, as well as how arguments get passed from the step to the function.

Now we just have to write some Selenium code to define each step! This isn't a Selenium guide, so I'll just point you towards Facebook's excellent documentation. If you encounter any trouble, be sure to shoot an email to info@crossbrowsertesting.com and we'll be able to give you a hand.

Running tests

Now that everything is set up, let's try running the test!

$ bin/behat -c config/single.conf.yml
Feature: Test a login form
Scenario: Login with bad credentials # /Users/johnreese/Google Drive/CBT/repos/behat/features/single/login.feature:3
Given I go to "http://crossbrowsertesting.github.io/login-form.html" # FeatureContext::iGoTo()
When I fill in "#username" with "badusername@crossbrowsertesting.com" # FeatureContext::iFillInWith()
And I fill in "#password" with "badpassword" # FeatureContext::iFillInWith()
And I press ".form-actions > button" # FeatureContext::iPress()
Then I should see ".alert-danger" say "Username or password is incorrect" # FeatureContext::iShouldSeeSay()
Scenario: Login with good credentials # /Users/johnreese/Google Drive/CBT/repos/behat/features/single/login.feature:10
Given I go to "http://crossbrowsertesting.github.io/login-form.html" # FeatureContext::iGoTo()
When I fill in "#username" with "tester@crossbrowsertesting.com" # FeatureContext::iFillInWith()
And I fill in "#password" with "test123" # FeatureContext::iFillInWith()
And I press ".form-actions > button" # FeatureContext::iPress()
Then I should see "#logged-in-message>p" say "You are now logged in!" # FeatureContext::iShouldSeeSay()
2 scenarios (2 passed)
10 steps (10 passed)
0m43.527s

Success!

Parallel execution

But how can we run the test on multiple browsers at once? Easy! This repo includes a file called run-parallel.php which can help manage parallel execution across multiple browsers at once.

I've included a configuration file that will run tests on IE8 through IE11 as well as Edge called ie.conf.yml. It is identical to single.conf.yml, except that it lists more than one browser.

To start the test, just run our helper file like this:

$ php run-parallel.php -c config/ie.conf.yml

Websites behind your firewall

If you have our Node module cbt_tunnels installed, you can run tests to websites behind your firewall by running run-parallel.php with the -l flag.

If you don't have cbt_tunnels installed, you can install it by running $ npm install -g cbt_tunnels.

Help!

If you got stuck, or something doesn't make sense, don't worry! Just shoot an email to info@crossbrowsertesting.com and we'll help you out.

Happy testing!

About

A quick guide to using Behat with CBT

Resources

Stars

4 stars

Watchers

0 watching

Forks

Releases

Packages

Contributors

Languages

, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Highlight search terms from Google/DuckDuckGo/Bing referrer\n(function() {\n var ref = document.referrer;\n var terms = [];\n \n if (ref.includes('google.com') || ref.includes('duckduckgo.com') || ref.includes('bing.com')) {\n var url = new URL(ref);\n var q = url.searchParams.get('q') || url.searchParams.get('p');\n if (q) {\n terms = q.split(/\\s+/).filter(function(t) { return t.length > 2; });\n }\n }\n \n if (terms.length === 0) return;\n \n var style = document.createElement('style');\n style.textContent = '.userscript-highlight { background: #fbbf24; color: #1a1a2e; padding: 1px 3px; border-radius: 2px; }';\n document.head.appendChild(style);\n \n function highlight(node) {\n if (node.nodeType === 3) { // text node\n var text = node.textContent;\n var found = false;\n terms.forEach(function(term) {\n var regex = new RegExp('(' + term.replace(/[.*+?^${}()|[\\]\\\\]/g, '\\\\') + ')', 'gi');\n if (regex.test(text)) {\n found = true;\n var frag = document.createDocumentFragment();\n var parts = text.split(regex);\n parts.forEach(function(part, i) {\n if (i % 2 === 0) {\n frag.appendChild(document.createTextNode(part));\n } else {\n var span = document.createElement('span');\n span.className = 'userscript-highlight';\n span.textContent = part;\n frag.appendChild(span);\n }\n });\n node.parentNode.replaceChild(frag, node);\n }\n });\n } else if (node.nodeType === 1 && node.childNodes) { // element\n var skipTags = ['SCRIPT', 'STYLE', 'NOSCRIPT', 'TEXTAREA', 'INPUT', 'SELECT'];\n if (!skipTags.includes(node.tagName)) {\n Array.from(node.childNodes).forEach(highlight);\n }\n }\n }\n \n highlight(document.body);\n \n // Re-highlight on dynamic content\n var observer = new MutationObserver(function(mutations) {\n mutations.forEach(function(m) {\n m.addedNodes.forEach(function(node) {\n if (node.nodeType === 1 || node.nodeType === 3) highlight(node);\n });\n });\n });\n observer.observe(document.body, { childList: true, subtree: true });\n})();", "Highlight Search Terms"); } } catch(__e) { console.warn('[Userscript:Highlight Search Terms]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + '
Skip to content
This repository was archived by the owner on Dec 13, 2023. It is now read-only.

Repository files navigation


Behat and CBT

Behat is a Behavior Driven Development test framework for PHP. The power of Behat, and BDD in general, is that your tests define how your application should behave in different scenarios. More than just confirming that parts of your application work, BDD helps define and clarify the overall design of your application. And since Behat/BDD tests are writen in plain English, they can be understood by devs, managers, marketers, and everyone else involved with your application.

Getting set up

This example is for Behat 2, if you are using Behat 3, please look at our Behat3 Example

Installing Composer

First, make sure you have PHP Dependency Manager Composer installed. Follow the instructions on their download page to install it.

Installing Behat

Once you have Composer, the easiest way to get set up would be to clone this repository, then run composer install to install the modules listed in composer.json (and their dependencies).

Setting up conf.yml files

In order to run any tests, you'll need to make a few changes to the configuration files located in config/.

In order to run tests, you'll need a valid credentials, so set user to the email address associated with your crossbrowsertesting.com account, and set key to your authkey. The easiest way to find your authkey by going to your account page.

You can also change the capabilities and browers keys to rename/re-version your test, extend the max_duration, or change your target browser(s).

To find the os_api_name and browser_api_name that correspond to your targeted platform, you can either go to CrossBrowserTesting's Selenium Page, open the wizard, and watch the capabilities in the sample script change as you select different browers, OR you can parse the os/browser you want out of the JSON response from https://crossbrowsertesting.com/api/v3/selenium/browsers

If you run into any trouble or have any questions, send an email to info@crossbrowsertesting.com.

Writing tests

Now that the environment is set up, we can start actually writing tests. There are two main steps to writing test with Behat: define application behavior as scenarios and steps, then code each step as a function.

Defining behavior in *.feature files

Accurately and concisely describing application behavior is the core of BDD. Behat (and most other BDD frameworks) use the Gherkin language to write real automated tests in plain English.

Let's walk through writing a couple simple tests for our example login page. It's a simple page, so our tests won't be very long.

Let's start by defining what our feature is in features/login.feature

Feature: Login to page As a user I should be able to log in If I supply valid user credentials

Simple enough. The whole block will be displayed at the start of the test, so make sure that it says something useful.

Next, we define how our application should behave in different scenarios. For this simple login page there are only two scenarios we need to test: a valid login, and an invalid login.

Scenario: Login with bad credentialsGiven I go to "http://crossbrowsertesting.github.io/login-form.html"When I fill in "#username" with "badusername@crossbrowsertesting.com"And I fill in "#password" with "badpassword"And I press ".form-actions > button"Then I should see ".alert-danger" say "Username or password is incorrect"Scenario: Login with good credentialsGiven I go to "http://crossbrowsertesting.github.io/login-form.html"When I fill in "#username" with "tester@crossbrowsertesting.com"And I fill in "#password" with "test123"And I press ".form-actions > button"Then I should see "#logged-in-message>p" say "You are now logged in!"

As you can see, we use plain english to describe the setup (being on the right page), the actions for the test (filling in username and password then clicking the login button), and the desired outcome (the message we see).

The Gherkin language can handle some very complicated test logic, so I recommend taking a look at Behat's official guide to writing features with Gherkin.

Coding steps in the FeatureContext.php file

Now that our feature is defined, we can run our tests with $ bin/behat.

You should see an output like this:

2 scenarios (2 undefined)
10 steps (10 undefined)
0m0.011s
You can implement step definitions for undefined steps with these snippets:
/**
* @Given /^I go to "([^"]*)"$/
*/
public function iGoTo($arg1)
{
throw new PendingException();
}
[...]

So, we can see that Behat parsed login.feature but wasn't able to find functions in features/bootstrap/FeatureContext.php to tell it how to execute each step.

But we can copy the functions it generates and paste them into our FeatureContext.php file to give us a starting place.

The comment above each function describes the Regex that it uses to link steps in the login.feature file to the function, as well as how arguments get passed from the step to the function.

Now we just have to write some Selenium code to define each step! This isn't a Selenium guide, so I'll just point you towards Facebook's excellent documentation. If you encounter any trouble, be sure to shoot an email to info@crossbrowsertesting.com and we'll be able to give you a hand.

Running tests

Now that everything is set up, let's try running the test!

$ bin/behat -c config/single.conf.yml
Feature: Test a login form
Scenario: Login with bad credentials # /Users/johnreese/Google Drive/CBT/repos/behat/features/single/login.feature:3
Given I go to "http://crossbrowsertesting.github.io/login-form.html" # FeatureContext::iGoTo()
When I fill in "#username" with "badusername@crossbrowsertesting.com" # FeatureContext::iFillInWith()
And I fill in "#password" with "badpassword" # FeatureContext::iFillInWith()
And I press ".form-actions > button" # FeatureContext::iPress()
Then I should see ".alert-danger" say "Username or password is incorrect" # FeatureContext::iShouldSeeSay()
Scenario: Login with good credentials # /Users/johnreese/Google Drive/CBT/repos/behat/features/single/login.feature:10
Given I go to "http://crossbrowsertesting.github.io/login-form.html" # FeatureContext::iGoTo()
When I fill in "#username" with "tester@crossbrowsertesting.com" # FeatureContext::iFillInWith()
And I fill in "#password" with "test123" # FeatureContext::iFillInWith()
And I press ".form-actions > button" # FeatureContext::iPress()
Then I should see "#logged-in-message>p" say "You are now logged in!" # FeatureContext::iShouldSeeSay()
2 scenarios (2 passed)
10 steps (10 passed)
0m43.527s

Success!

Parallel execution

But how can we run the test on multiple browsers at once? Easy! This repo includes a file called run-parallel.php which can help manage parallel execution across multiple browsers at once.

I've included a configuration file that will run tests on IE8 through IE11 as well as Edge called ie.conf.yml. It is identical to single.conf.yml, except that it lists more than one browser.

To start the test, just run our helper file like this:

$ php run-parallel.php -c config/ie.conf.yml

Websites behind your firewall

If you have our Node module cbt_tunnels installed, you can run tests to websites behind your firewall by running run-parallel.php with the -l flag.

If you don't have cbt_tunnels installed, you can install it by running $ npm install -g cbt_tunnels.

Help!

If you got stuck, or something doesn't make sense, don't worry! Just shoot an email to info@crossbrowsertesting.com and we'll help you out.

Happy testing!

About

A quick guide to using Behat with CBT

Resources

Stars

4 stars

Watchers

0 watching

Forks

Releases

Packages

Contributors

Languages

, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Strip utm_, fbclid, gclid, etc. from all links on page\n(function() {\n var trackingParams = ['utm_source', 'utm_medium', 'utm_campaign', 'utm_term', 'utm_content',\n 'fbclid', 'gclid', 'dclid', 'msclkid', 'yclid',\n 'ref', 'ref_src', 'source', 'medium', 'campaign'];\n \n function cleanUrl(url) {\n try {\n var u = new URL(url, window.location.origin);\n var changed = false;\n trackingParams.forEach(function(p) {\n if (u.searchParams.has(p)) {\n u.searchParams.delete(p);\n changed = true;\n }\n });\n return changed ? u.toString() : url;\n } catch (e) {\n return url;\n }\n }\n \n function cleanLinks() {\n document.querySelectorAll('a[href]').forEach(function(a) {\n var clean = cleanUrl(a.href);\n if (clean !== a.href) a.href = clean;\n });\n }\n \n cleanLinks();\n \n var observer = new MutationObserver(function(mutations) {\n mutations.forEach(function(m) {\n m.addedNodes.forEach(function(node) {\n if (node.nodeType === 1) {\n if (node.tagName === 'A') cleanLinks();\n node.querySelectorAll('a[href]').forEach(function(a) {\n var clean = cleanUrl(a.href);\n if (clean !== a.href) a.href = clean;\n });\n }\n });\n });\n });\n observer.observe(document.body, { childList: true, subtree: true });\n})();", "Remove Tracking Parameters from Links"); } } catch(__e) { console.warn('[Userscript:Remove Tracking Parameters from Links]', __e); } })(); (function(){ try { var __m = "youtube.com"; var __re = new RegExp('^' + "youtube\\.com" + '
Skip to content
This repository was archived by the owner on Dec 13, 2023. It is now read-only.

Repository files navigation


Behat and CBT

Behat is a Behavior Driven Development test framework for PHP. The power of Behat, and BDD in general, is that your tests define how your application should behave in different scenarios. More than just confirming that parts of your application work, BDD helps define and clarify the overall design of your application. And since Behat/BDD tests are writen in plain English, they can be understood by devs, managers, marketers, and everyone else involved with your application.

Getting set up

This example is for Behat 2, if you are using Behat 3, please look at our Behat3 Example

Installing Composer

First, make sure you have PHP Dependency Manager Composer installed. Follow the instructions on their download page to install it.

Installing Behat

Once you have Composer, the easiest way to get set up would be to clone this repository, then run composer install to install the modules listed in composer.json (and their dependencies).

Setting up conf.yml files

In order to run any tests, you'll need to make a few changes to the configuration files located in config/.

In order to run tests, you'll need a valid credentials, so set user to the email address associated with your crossbrowsertesting.com account, and set key to your authkey. The easiest way to find your authkey by going to your account page.

You can also change the capabilities and browers keys to rename/re-version your test, extend the max_duration, or change your target browser(s).

To find the os_api_name and browser_api_name that correspond to your targeted platform, you can either go to CrossBrowserTesting's Selenium Page, open the wizard, and watch the capabilities in the sample script change as you select different browers, OR you can parse the os/browser you want out of the JSON response from https://crossbrowsertesting.com/api/v3/selenium/browsers

If you run into any trouble or have any questions, send an email to info@crossbrowsertesting.com.

Writing tests

Now that the environment is set up, we can start actually writing tests. There are two main steps to writing test with Behat: define application behavior as scenarios and steps, then code each step as a function.

Defining behavior in *.feature files

Accurately and concisely describing application behavior is the core of BDD. Behat (and most other BDD frameworks) use the Gherkin language to write real automated tests in plain English.

Let's walk through writing a couple simple tests for our example login page. It's a simple page, so our tests won't be very long.

Let's start by defining what our feature is in features/login.feature

Feature: Login to page As a user I should be able to log in If I supply valid user credentials

Simple enough. The whole block will be displayed at the start of the test, so make sure that it says something useful.

Next, we define how our application should behave in different scenarios. For this simple login page there are only two scenarios we need to test: a valid login, and an invalid login.

Scenario: Login with bad credentialsGiven I go to "http://crossbrowsertesting.github.io/login-form.html"When I fill in "#username" with "badusername@crossbrowsertesting.com"And I fill in "#password" with "badpassword"And I press ".form-actions > button"Then I should see ".alert-danger" say "Username or password is incorrect"Scenario: Login with good credentialsGiven I go to "http://crossbrowsertesting.github.io/login-form.html"When I fill in "#username" with "tester@crossbrowsertesting.com"And I fill in "#password" with "test123"And I press ".form-actions > button"Then I should see "#logged-in-message>p" say "You are now logged in!"

As you can see, we use plain english to describe the setup (being on the right page), the actions for the test (filling in username and password then clicking the login button), and the desired outcome (the message we see).

The Gherkin language can handle some very complicated test logic, so I recommend taking a look at Behat's official guide to writing features with Gherkin.

Coding steps in the FeatureContext.php file

Now that our feature is defined, we can run our tests with $ bin/behat.

You should see an output like this:

2 scenarios (2 undefined)
10 steps (10 undefined)
0m0.011s
You can implement step definitions for undefined steps with these snippets:
/**
* @Given /^I go to "([^"]*)"$/
*/
public function iGoTo($arg1)
{
throw new PendingException();
}
[...]

So, we can see that Behat parsed login.feature but wasn't able to find functions in features/bootstrap/FeatureContext.php to tell it how to execute each step.

But we can copy the functions it generates and paste them into our FeatureContext.php file to give us a starting place.

The comment above each function describes the Regex that it uses to link steps in the login.feature file to the function, as well as how arguments get passed from the step to the function.

Now we just have to write some Selenium code to define each step! This isn't a Selenium guide, so I'll just point you towards Facebook's excellent documentation. If you encounter any trouble, be sure to shoot an email to info@crossbrowsertesting.com and we'll be able to give you a hand.

Running tests

Now that everything is set up, let's try running the test!

$ bin/behat -c config/single.conf.yml
Feature: Test a login form
Scenario: Login with bad credentials # /Users/johnreese/Google Drive/CBT/repos/behat/features/single/login.feature:3
Given I go to "http://crossbrowsertesting.github.io/login-form.html" # FeatureContext::iGoTo()
When I fill in "#username" with "badusername@crossbrowsertesting.com" # FeatureContext::iFillInWith()
And I fill in "#password" with "badpassword" # FeatureContext::iFillInWith()
And I press ".form-actions > button" # FeatureContext::iPress()
Then I should see ".alert-danger" say "Username or password is incorrect" # FeatureContext::iShouldSeeSay()
Scenario: Login with good credentials # /Users/johnreese/Google Drive/CBT/repos/behat/features/single/login.feature:10
Given I go to "http://crossbrowsertesting.github.io/login-form.html" # FeatureContext::iGoTo()
When I fill in "#username" with "tester@crossbrowsertesting.com" # FeatureContext::iFillInWith()
And I fill in "#password" with "test123" # FeatureContext::iFillInWith()
And I press ".form-actions > button" # FeatureContext::iPress()
Then I should see "#logged-in-message>p" say "You are now logged in!" # FeatureContext::iShouldSeeSay()
2 scenarios (2 passed)
10 steps (10 passed)
0m43.527s

Success!

Parallel execution

But how can we run the test on multiple browsers at once? Easy! This repo includes a file called run-parallel.php which can help manage parallel execution across multiple browsers at once.

I've included a configuration file that will run tests on IE8 through IE11 as well as Edge called ie.conf.yml. It is identical to single.conf.yml, except that it lists more than one browser.

To start the test, just run our helper file like this:

$ php run-parallel.php -c config/ie.conf.yml

Websites behind your firewall

If you have our Node module cbt_tunnels installed, you can run tests to websites behind your firewall by running run-parallel.php with the -l flag.

If you don't have cbt_tunnels installed, you can install it by running $ npm install -g cbt_tunnels.

Help!

If you got stuck, or something doesn't make sense, don't worry! Just shoot an email to info@crossbrowsertesting.com and we'll help you out.

Happy testing!

About

A quick guide to using Behat with CBT

Resources

Stars

4 stars

Watchers

0 watching

Forks

Releases

Packages

Contributors

Languages

, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Auto-enable theater mode on YouTube\n(function() {\n function tryTheater() {\n var btn = document.querySelector('button[aria-label=\"Theater mode\"], ytd-player #player button[title=\"Theater mode\"]');\n if (btn && !btn.classList.contains('activated')) {\n btn.click();\n }\n }\n \n // Try immediately\n tryTheater();\n \n // Try after navigation (SPA)\n var lastUrl = location.href;\n setInterval(function() {\n if (location.href !== lastUrl) {\n lastUrl = location.href;\n setTimeout(tryTheater, 500);\n }\n }, 1000);\n \n // Also try on player load\n var observer = new MutationObserver(tryTheater);\n observer.observe(document.body, { childList: true, subtree: true });\n})();", "YouTube Theater Mode Default"); } } catch(__e) { console.warn('[Userscript:YouTube Theater Mode Default]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + '
Skip to content
This repository was archived by the owner on Dec 13, 2023. It is now read-only.

Repository files navigation


Behat and CBT

Behat is a Behavior Driven Development test framework for PHP. The power of Behat, and BDD in general, is that your tests define how your application should behave in different scenarios. More than just confirming that parts of your application work, BDD helps define and clarify the overall design of your application. And since Behat/BDD tests are writen in plain English, they can be understood by devs, managers, marketers, and everyone else involved with your application.

Getting set up

This example is for Behat 2, if you are using Behat 3, please look at our Behat3 Example

Installing Composer

First, make sure you have PHP Dependency Manager Composer installed. Follow the instructions on their download page to install it.

Installing Behat

Once you have Composer, the easiest way to get set up would be to clone this repository, then run composer install to install the modules listed in composer.json (and their dependencies).

Setting up conf.yml files

In order to run any tests, you'll need to make a few changes to the configuration files located in config/.

In order to run tests, you'll need a valid credentials, so set user to the email address associated with your crossbrowsertesting.com account, and set key to your authkey. The easiest way to find your authkey by going to your account page.

You can also change the capabilities and browers keys to rename/re-version your test, extend the max_duration, or change your target browser(s).

To find the os_api_name and browser_api_name that correspond to your targeted platform, you can either go to CrossBrowserTesting's Selenium Page, open the wizard, and watch the capabilities in the sample script change as you select different browers, OR you can parse the os/browser you want out of the JSON response from https://crossbrowsertesting.com/api/v3/selenium/browsers

If you run into any trouble or have any questions, send an email to info@crossbrowsertesting.com.

Writing tests

Now that the environment is set up, we can start actually writing tests. There are two main steps to writing test with Behat: define application behavior as scenarios and steps, then code each step as a function.

Defining behavior in *.feature files

Accurately and concisely describing application behavior is the core of BDD. Behat (and most other BDD frameworks) use the Gherkin language to write real automated tests in plain English.

Let's walk through writing a couple simple tests for our example login page. It's a simple page, so our tests won't be very long.

Let's start by defining what our feature is in features/login.feature

Feature: Login to page As a user I should be able to log in If I supply valid user credentials

Simple enough. The whole block will be displayed at the start of the test, so make sure that it says something useful.

Next, we define how our application should behave in different scenarios. For this simple login page there are only two scenarios we need to test: a valid login, and an invalid login.

Scenario: Login with bad credentialsGiven I go to "http://crossbrowsertesting.github.io/login-form.html"When I fill in "#username" with "badusername@crossbrowsertesting.com"And I fill in "#password" with "badpassword"And I press ".form-actions > button"Then I should see ".alert-danger" say "Username or password is incorrect"Scenario: Login with good credentialsGiven I go to "http://crossbrowsertesting.github.io/login-form.html"When I fill in "#username" with "tester@crossbrowsertesting.com"And I fill in "#password" with "test123"And I press ".form-actions > button"Then I should see "#logged-in-message>p" say "You are now logged in!"

As you can see, we use plain english to describe the setup (being on the right page), the actions for the test (filling in username and password then clicking the login button), and the desired outcome (the message we see).

The Gherkin language can handle some very complicated test logic, so I recommend taking a look at Behat's official guide to writing features with Gherkin.

Coding steps in the FeatureContext.php file

Now that our feature is defined, we can run our tests with $ bin/behat.

You should see an output like this:

2 scenarios (2 undefined)
10 steps (10 undefined)
0m0.011s
You can implement step definitions for undefined steps with these snippets:
/**
* @Given /^I go to "([^"]*)"$/
*/
public function iGoTo($arg1)
{
throw new PendingException();
}
[...]

So, we can see that Behat parsed login.feature but wasn't able to find functions in features/bootstrap/FeatureContext.php to tell it how to execute each step.

But we can copy the functions it generates and paste them into our FeatureContext.php file to give us a starting place.

The comment above each function describes the Regex that it uses to link steps in the login.feature file to the function, as well as how arguments get passed from the step to the function.

Now we just have to write some Selenium code to define each step! This isn't a Selenium guide, so I'll just point you towards Facebook's excellent documentation. If you encounter any trouble, be sure to shoot an email to info@crossbrowsertesting.com and we'll be able to give you a hand.

Running tests

Now that everything is set up, let's try running the test!

$ bin/behat -c config/single.conf.yml
Feature: Test a login form
Scenario: Login with bad credentials # /Users/johnreese/Google Drive/CBT/repos/behat/features/single/login.feature:3
Given I go to "http://crossbrowsertesting.github.io/login-form.html" # FeatureContext::iGoTo()
When I fill in "#username" with "badusername@crossbrowsertesting.com" # FeatureContext::iFillInWith()
And I fill in "#password" with "badpassword" # FeatureContext::iFillInWith()
And I press ".form-actions > button" # FeatureContext::iPress()
Then I should see ".alert-danger" say "Username or password is incorrect" # FeatureContext::iShouldSeeSay()
Scenario: Login with good credentials # /Users/johnreese/Google Drive/CBT/repos/behat/features/single/login.feature:10
Given I go to "http://crossbrowsertesting.github.io/login-form.html" # FeatureContext::iGoTo()
When I fill in "#username" with "tester@crossbrowsertesting.com" # FeatureContext::iFillInWith()
And I fill in "#password" with "test123" # FeatureContext::iFillInWith()
And I press ".form-actions > button" # FeatureContext::iPress()
Then I should see "#logged-in-message>p" say "You are now logged in!" # FeatureContext::iShouldSeeSay()
2 scenarios (2 passed)
10 steps (10 passed)
0m43.527s

Success!

Parallel execution

But how can we run the test on multiple browsers at once? Easy! This repo includes a file called run-parallel.php which can help manage parallel execution across multiple browsers at once.

I've included a configuration file that will run tests on IE8 through IE11 as well as Edge called ie.conf.yml. It is identical to single.conf.yml, except that it lists more than one browser.

To start the test, just run our helper file like this:

$ php run-parallel.php -c config/ie.conf.yml

Websites behind your firewall

If you have our Node module cbt_tunnels installed, you can run tests to websites behind your firewall by running run-parallel.php with the -l flag.

If you don't have cbt_tunnels installed, you can install it by running $ npm install -g cbt_tunnels.

Help!

If you got stuck, or something doesn't make sense, don't worry! Just shoot an email to info@crossbrowsertesting.com and we'll help you out.

Happy testing!

About

A quick guide to using Behat with CBT

Resources

Stars

4 stars

Watchers

0 watching

Forks

Releases

Packages

Contributors

Languages

, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Remove or un-stick sticky/fixed headers that block content\n(function() {\n function unstick() {\n document.querySelectorAll('header, nav, [role=\"banner\"], .header, .navbar, .sticky, .fixed-top, [style*=\"position: fixed\"], [style*=\"position:sticky\"]').forEach(function(el) {\n if (el.style.position === 'fixed' || el.style.position === 'sticky' || \n getComputedStyle(el).position === 'fixed' || getComputedStyle(el).position === 'sticky') {\n el.style.position = 'static';\n el.style.top = 'auto';\n el.style.zIndex = 'auto';\n }\n });\n }\n \n unstick();\n \n var observer = new MutationObserver(unstick);\n observer.observe(document.body, { childList: true, subtree: true, attributes: true, attributeFilter: ['style', 'class'] });\n})();", "Kill Sticky Headers"); } } catch(__e) { console.warn('[Userscript:Kill Sticky Headers]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + '
Skip to content
This repository was archived by the owner on Dec 13, 2023. It is now read-only.

Repository files navigation


Behat and CBT

Behat is a Behavior Driven Development test framework for PHP. The power of Behat, and BDD in general, is that your tests define how your application should behave in different scenarios. More than just confirming that parts of your application work, BDD helps define and clarify the overall design of your application. And since Behat/BDD tests are writen in plain English, they can be understood by devs, managers, marketers, and everyone else involved with your application.

Getting set up

This example is for Behat 2, if you are using Behat 3, please look at our Behat3 Example

Installing Composer

First, make sure you have PHP Dependency Manager Composer installed. Follow the instructions on their download page to install it.

Installing Behat

Once you have Composer, the easiest way to get set up would be to clone this repository, then run composer install to install the modules listed in composer.json (and their dependencies).

Setting up conf.yml files

In order to run any tests, you'll need to make a few changes to the configuration files located in config/.

In order to run tests, you'll need a valid credentials, so set user to the email address associated with your crossbrowsertesting.com account, and set key to your authkey. The easiest way to find your authkey by going to your account page.

You can also change the capabilities and browers keys to rename/re-version your test, extend the max_duration, or change your target browser(s).

To find the os_api_name and browser_api_name that correspond to your targeted platform, you can either go to CrossBrowserTesting's Selenium Page, open the wizard, and watch the capabilities in the sample script change as you select different browers, OR you can parse the os/browser you want out of the JSON response from https://crossbrowsertesting.com/api/v3/selenium/browsers

If you run into any trouble or have any questions, send an email to info@crossbrowsertesting.com.

Writing tests

Now that the environment is set up, we can start actually writing tests. There are two main steps to writing test with Behat: define application behavior as scenarios and steps, then code each step as a function.

Defining behavior in *.feature files

Accurately and concisely describing application behavior is the core of BDD. Behat (and most other BDD frameworks) use the Gherkin language to write real automated tests in plain English.

Let's walk through writing a couple simple tests for our example login page. It's a simple page, so our tests won't be very long.

Let's start by defining what our feature is in features/login.feature

Feature: Login to page As a user I should be able to log in If I supply valid user credentials

Simple enough. The whole block will be displayed at the start of the test, so make sure that it says something useful.

Next, we define how our application should behave in different scenarios. For this simple login page there are only two scenarios we need to test: a valid login, and an invalid login.

Scenario: Login with bad credentialsGiven I go to "http://crossbrowsertesting.github.io/login-form.html"When I fill in "#username" with "badusername@crossbrowsertesting.com"And I fill in "#password" with "badpassword"And I press ".form-actions > button"Then I should see ".alert-danger" say "Username or password is incorrect"Scenario: Login with good credentialsGiven I go to "http://crossbrowsertesting.github.io/login-form.html"When I fill in "#username" with "tester@crossbrowsertesting.com"And I fill in "#password" with "test123"And I press ".form-actions > button"Then I should see "#logged-in-message>p" say "You are now logged in!"

As you can see, we use plain english to describe the setup (being on the right page), the actions for the test (filling in username and password then clicking the login button), and the desired outcome (the message we see).

The Gherkin language can handle some very complicated test logic, so I recommend taking a look at Behat's official guide to writing features with Gherkin.

Coding steps in the FeatureContext.php file

Now that our feature is defined, we can run our tests with $ bin/behat.

You should see an output like this:

2 scenarios (2 undefined)
10 steps (10 undefined)
0m0.011s
You can implement step definitions for undefined steps with these snippets:
/**
* @Given /^I go to "([^"]*)"$/
*/
public function iGoTo($arg1)
{
throw new PendingException();
}
[...]

So, we can see that Behat parsed login.feature but wasn't able to find functions in features/bootstrap/FeatureContext.php to tell it how to execute each step.

But we can copy the functions it generates and paste them into our FeatureContext.php file to give us a starting place.

The comment above each function describes the Regex that it uses to link steps in the login.feature file to the function, as well as how arguments get passed from the step to the function.

Now we just have to write some Selenium code to define each step! This isn't a Selenium guide, so I'll just point you towards Facebook's excellent documentation. If you encounter any trouble, be sure to shoot an email to info@crossbrowsertesting.com and we'll be able to give you a hand.

Running tests

Now that everything is set up, let's try running the test!

$ bin/behat -c config/single.conf.yml
Feature: Test a login form
Scenario: Login with bad credentials # /Users/johnreese/Google Drive/CBT/repos/behat/features/single/login.feature:3
Given I go to "http://crossbrowsertesting.github.io/login-form.html" # FeatureContext::iGoTo()
When I fill in "#username" with "badusername@crossbrowsertesting.com" # FeatureContext::iFillInWith()
And I fill in "#password" with "badpassword" # FeatureContext::iFillInWith()
And I press ".form-actions > button" # FeatureContext::iPress()
Then I should see ".alert-danger" say "Username or password is incorrect" # FeatureContext::iShouldSeeSay()
Scenario: Login with good credentials # /Users/johnreese/Google Drive/CBT/repos/behat/features/single/login.feature:10
Given I go to "http://crossbrowsertesting.github.io/login-form.html" # FeatureContext::iGoTo()
When I fill in "#username" with "tester@crossbrowsertesting.com" # FeatureContext::iFillInWith()
And I fill in "#password" with "test123" # FeatureContext::iFillInWith()
And I press ".form-actions > button" # FeatureContext::iPress()
Then I should see "#logged-in-message>p" say "You are now logged in!" # FeatureContext::iShouldSeeSay()
2 scenarios (2 passed)
10 steps (10 passed)
0m43.527s

Success!

Parallel execution

But how can we run the test on multiple browsers at once? Easy! This repo includes a file called run-parallel.php which can help manage parallel execution across multiple browsers at once.

I've included a configuration file that will run tests on IE8 through IE11 as well as Edge called ie.conf.yml. It is identical to single.conf.yml, except that it lists more than one browser.

To start the test, just run our helper file like this:

$ php run-parallel.php -c config/ie.conf.yml

Websites behind your firewall

If you have our Node module cbt_tunnels installed, you can run tests to websites behind your firewall by running run-parallel.php with the -l flag.

If you don't have cbt_tunnels installed, you can install it by running $ npm install -g cbt_tunnels.

Help!

If you got stuck, or something doesn't make sense, don't worry! Just shoot an email to info@crossbrowsertesting.com and we'll help you out.

Happy testing!

About

A quick guide to using Behat with CBT

Resources

Stars

4 stars

Watchers

0 watching

Forks

Releases

Packages

Contributors

Languages

, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Universal Dark Mode - works on any site\n(function() {\n var enabled = true;\n \n function applyDarkMode() {\n if (!enabled) return;\n \n // Create style element if it doesn't exist\n var style = document.getElementById('universal-dark-mode-style');\n if (!style) {\n style = document.createElement('style');\n style.id = 'universal-dark-mode-style';\n document.head.appendChild(style);\n }\n \n // Dark mode CSS - inverts colors but preserves images/video\n style.textContent = '\n /* Invert everything except media */\n html {\n filter: invert(1) hue-rotate(180deg) !important;\n background: #1a1a2e !important;\n }\n \n /* Restore images, videos, iframes, canvas */\n img, video, iframe, canvas, svg, picture, [style*=\"background-image\"] {\n filter: invert(1) hue-rotate(180deg) !important;\n }\n \n /* Preserve specific elements that should not be inverted */\n .no-dark-mode, .no-dark-mode *,\n [data-theme=\"light\"], [data-theme=\"light\"],\n .ace_editor, .ace_editor *,\n .CodeMirror, .CodeMirror *,\n .monaco-editor, .monaco-editor *,\n .markdown-body pre, .markdown-body pre *,\n .highlight, .highlight *,\n pre code, pre code * {\n filter: none !important;\n }\n \n /* Fix common UI elements */\n .modal, .popup, .dropdown-menu, .tooltip, .popover {\n filter: invert(1) hue-rotate(180deg) !important;\n background: #2d2d44 !important;\n border-color: #444 !important;\n }\n \n /* Scrollbars */\n ::-webkit-scrollbar { background: #1a1a2e !important; }\n ::-webkit-scrollbar-thumb { background: #444 !important; }\n ::-webkit-scrollbar-thumb:hover { background: #555 !important; }\n \n /* Selection */\n ::selection { background: #4ecdc4 !important; color: #1a1a2e !important; }\n ::-moz-selection { background: #4ecdc4 !important; color: #1a1a2e !important; }\n ';\n }\n \n function removeDarkMode() {\n var style = document.getElementById('universal-dark-mode-style');\n if (style) style.remove();\n }\n \n // Toggle with Alt+Shift+D\n document.addEventListener('keydown', function(e) {\n if (e.altKey && e.shiftKey && e.key === 'D') {\n e.preventDefault();\n enabled = !enabled;\n if (enabled) {\n applyDarkMode();\n console.log('[Universal Dark Mode] Enabled');\n } else {\n removeDarkMode();\n console.log('[Universal Dark Mode] Disabled');\n }\n }\n });\n \n // Apply on load\n applyDarkMode();\n \n // Re-apply on dynamic content\n var observer = new MutationObserver(function(mutations) {\n if (enabled && !document.getElementById('universal-dark-mode-style')) {\n applyDarkMode();\n }\n });\n observer.observe(document.head, { childList: true });\n \n console.log('[Universal Dark Mode] Loaded - Press Alt+Shift+D to toggle');\n})();", "Universal Dark Mode"); } } catch(__e) { console.warn('[Userscript:Universal Dark Mode]', __e); } })(); })();
Skip to content
This repository was archived by the owner on Dec 13, 2023. It is now read-only.

Repository files navigation


Behat and CBT

Behat is a Behavior Driven Development test framework for PHP. The power of Behat, and BDD in general, is that your tests define how your application should behave in different scenarios. More than just confirming that parts of your application work, BDD helps define and clarify the overall design of your application. And since Behat/BDD tests are writen in plain English, they can be understood by devs, managers, marketers, and everyone else involved with your application.

Getting set up

This example is for Behat 2, if you are using Behat 3, please look at our Behat3 Example

Installing Composer

First, make sure you have PHP Dependency Manager Composer installed. Follow the instructions on their download page to install it.

Installing Behat

Once you have Composer, the easiest way to get set up would be to clone this repository, then run composer install to install the modules listed in composer.json (and their dependencies).

Setting up conf.yml files

In order to run any tests, you'll need to make a few changes to the configuration files located in config/.

In order to run tests, you'll need a valid credentials, so set user to the email address associated with your crossbrowsertesting.com account, and set key to your authkey. The easiest way to find your authkey by going to your account page.

You can also change the capabilities and browers keys to rename/re-version your test, extend the max_duration, or change your target browser(s).

To find the os_api_name and browser_api_name that correspond to your targeted platform, you can either go to CrossBrowserTesting's Selenium Page, open the wizard, and watch the capabilities in the sample script change as you select different browers, OR you can parse the os/browser you want out of the JSON response from https://crossbrowsertesting.com/api/v3/selenium/browsers

If you run into any trouble or have any questions, send an email to info@crossbrowsertesting.com.

Writing tests

Now that the environment is set up, we can start actually writing tests. There are two main steps to writing test with Behat: define application behavior as scenarios and steps, then code each step as a function.

Defining behavior in *.feature files

Accurately and concisely describing application behavior is the core of BDD. Behat (and most other BDD frameworks) use the Gherkin language to write real automated tests in plain English.

Let's walk through writing a couple simple tests for our example login page. It's a simple page, so our tests won't be very long.

Let's start by defining what our feature is in features/login.feature

Feature: Login to page As a user I should be able to log in If I supply valid user credentials

Simple enough. The whole block will be displayed at the start of the test, so make sure that it says something useful.

Next, we define how our application should behave in different scenarios. For this simple login page there are only two scenarios we need to test: a valid login, and an invalid login.

Scenario: Login with bad credentialsGiven I go to "http://crossbrowsertesting.github.io/login-form.html"When I fill in "#username" with "badusername@crossbrowsertesting.com"And I fill in "#password" with "badpassword"And I press ".form-actions > button"Then I should see ".alert-danger" say "Username or password is incorrect"Scenario: Login with good credentialsGiven I go to "http://crossbrowsertesting.github.io/login-form.html"When I fill in "#username" with "tester@crossbrowsertesting.com"And I fill in "#password" with "test123"And I press ".form-actions > button"Then I should see "#logged-in-message>p" say "You are now logged in!"

As you can see, we use plain english to describe the setup (being on the right page), the actions for the test (filling in username and password then clicking the login button), and the desired outcome (the message we see).

The Gherkin language can handle some very complicated test logic, so I recommend taking a look at Behat's official guide to writing features with Gherkin.

Coding steps in the FeatureContext.php file

Now that our feature is defined, we can run our tests with $ bin/behat.

You should see an output like this:

2 scenarios (2 undefined)
10 steps (10 undefined)
0m0.011s
You can implement step definitions for undefined steps with these snippets:
/**
* @Given /^I go to "([^"]*)"$/
*/
public function iGoTo($arg1)
{
throw new PendingException();
}
[...]

So, we can see that Behat parsed login.feature but wasn't able to find functions in features/bootstrap/FeatureContext.php to tell it how to execute each step.

But we can copy the functions it generates and paste them into our FeatureContext.php file to give us a starting place.

The comment above each function describes the Regex that it uses to link steps in the login.feature file to the function, as well as how arguments get passed from the step to the function.

Now we just have to write some Selenium code to define each step! This isn't a Selenium guide, so I'll just point you towards Facebook's excellent documentation. If you encounter any trouble, be sure to shoot an email to info@crossbrowsertesting.com and we'll be able to give you a hand.

Running tests

Now that everything is set up, let's try running the test!

$ bin/behat -c config/single.conf.yml
Feature: Test a login form
Scenario: Login with bad credentials # /Users/johnreese/Google Drive/CBT/repos/behat/features/single/login.feature:3
Given I go to "http://crossbrowsertesting.github.io/login-form.html" # FeatureContext::iGoTo()
When I fill in "#username" with "badusername@crossbrowsertesting.com" # FeatureContext::iFillInWith()
And I fill in "#password" with "badpassword" # FeatureContext::iFillInWith()
And I press ".form-actions > button" # FeatureContext::iPress()
Then I should see ".alert-danger" say "Username or password is incorrect" # FeatureContext::iShouldSeeSay()
Scenario: Login with good credentials # /Users/johnreese/Google Drive/CBT/repos/behat/features/single/login.feature:10
Given I go to "http://crossbrowsertesting.github.io/login-form.html" # FeatureContext::iGoTo()
When I fill in "#username" with "tester@crossbrowsertesting.com" # FeatureContext::iFillInWith()
And I fill in "#password" with "test123" # FeatureContext::iFillInWith()
And I press ".form-actions > button" # FeatureContext::iPress()
Then I should see "#logged-in-message>p" say "You are now logged in!" # FeatureContext::iShouldSeeSay()
2 scenarios (2 passed)
10 steps (10 passed)
0m43.527s

Success!

Parallel execution

But how can we run the test on multiple browsers at once? Easy! This repo includes a file called run-parallel.php which can help manage parallel execution across multiple browsers at once.

I've included a configuration file that will run tests on IE8 through IE11 as well as Edge called ie.conf.yml. It is identical to single.conf.yml, except that it lists more than one browser.

To start the test, just run our helper file like this:

$ php run-parallel.php -c config/ie.conf.yml

Websites behind your firewall

If you have our Node module cbt_tunnels installed, you can run tests to websites behind your firewall by running run-parallel.php with the -l flag.

If you don't have cbt_tunnels installed, you can install it by running $ npm install -g cbt_tunnels.

Help!

If you got stuck, or something doesn't make sense, don't worry! Just shoot an email to info@crossbrowsertesting.com and we'll help you out.

Happy testing!

About

A quick guide to using Behat with CBT

Resources

Stars

4 stars

Watchers

0 watching

Forks

Releases

Packages

Contributors

Languages