What is common and different between Behavior Driven Development [BDD] & integration testing?

John Dee answers a question on Quora

I think this is one of those cases where simply knowing what the words mean helps. This question is exactly like, “What is common and different between Western Medicine and heart surgery?”

Behavior Driven Development[1] – Is a methodology and a philosophy of test first software development. It attempts to describe software “from the outside in” in terms of the behavior of system actors. BDD is a constellation of practices, tools, language [both computer and human], and techniques that include may include some of all of these elements: automated testing, DevOps, TestDD, Gherkin, Cucumber, Codeception, AcceptanceTestDD, Agile methodologies, and many others.

Integration testing[2] – In software development, especially in large projects that involve many teams, software architects may decide to conduct their work in “modules”. That is, separate software entities that are well, modular. Often a specific team will work on a specific module, so that Team A works on Module A, Team B works on Module B and so on. Integration testing is the activity of applying tests to groups of modules to “integrate” them. In other words, Module A works nice with Module B… add complexity.

The two terms aren’t diametrically related. You can do integration testing if your project has multiple large components. You can have a BDD philosophy [actually your SHOULD have a BDD philosophy in your software project], but you could develop software in many ways [Waterfall. Cowboy coding.] that might be less effective. You could perform integration testing as your only software methodology on a particular project. For instance, if the entire project revolved around merging two 3rd party projects: like putting two WordPress plugins on a site.

Read John Dee's answer to What is common and different between Behavior Driven Development [BDD] & integration testing? on Quora

Why is test driven development not made mandatory for all new software development across all companies?

Read John Dee's answer to Why is test driven development not made mandatory for all new software development across all companies? on Quora

Business Stakeholders: How to Describe a Software FEATURE

A feature from the biz perspective

What is a feature?
A feature is an aspect of software that is useful. Anything you can express, that is possible, and that you can afford, can be a feature. A bug is an aspect of software that isn’t useful.

Since we’re talking about development, we’re discussing software features that don’t exist yet. These are features that we would like to build, or existing features that we would like to make better. Describe a feature with should statements:

  • It should email all the clients once a month.
  • The client should have a setting page in the admin area.
  • The plugin should have a custom post type called GPS coordinates for each subscriber.
  • The div should show a timeline of Civil War battles in the footer area.

The next statement you should create is the reason for the feature you are requesting. What is the business value of this feature? Describe the reason by using a “Because”, or “So that”  or “In or that”

  • So that the clients are routinely updated.
  • In order that the user can change the settings.
  • Because we need to store the GPS data.

Alternatively, you can use Gherkin syntax for feature development.

The Toolkit for WordPress BDD


To do Behavior Driven Development [BDD] in WordPress, you need to get the tools! Here is the stack you should use:

Operating System

Ubuntu 16 LTS. I personally use an Ubuntu 17 development server on my laptop. You can run Ubuntu on most machines with a USB memory stick, and it’s free. I use Ubuntu on the Amzaon AWS remote cloud servers and production servers. Ubuntu is a brand, but it’s just a Debian based Linux distro, so it’s future proof. If you stopped liking Ubuntu, you could switch to another distro without hassel.
You can also use Mac or Windows.

Get the stack

Once you have a machine with Ubuntu running, you can load the entire development stack by running a single command:
source <(curl -s https://raw.githubusercontent.com/johndeebdd/Remote-BDD-Setup/master/installScripts/wordpress.sh)
Directions

Test Framework

Codeception with WordPress modules - PHPunit is the standard and default library for doing unit testing in PHP. CodeCeption INCLUDES PHPunit, as well as a whole series of libraries for doing BDD.

Acceptance testing

You should use the WPWebDriver and WPDb modules. You can use Selenium to drive a full browser if you want, but generally you should use PhantomJS, because it is much faster. You can write your test in the Gherkin format, or in procedural PHP. Generally, I consider Gherkin cumbersome and not worth the candle.
Sample acceptance.yml

WP-Unit testing

You should use the WPloader and WPQueries modules.
Sample unit.yml

Where does code live?

Use a Git repo. Use Github for code that has a public face. Use Bitbucket for private repos [or pay Github for a private repo, either way].

How do you control outsourcer Git commit access?

First setup a few emails: freelancer1@yourdomain.com, freelancer2@yourdomain.com etc. These accounts are granted direct commit access to the repo. Give the outsourcer access to the email account. The repo itself can set a webhook to pull to the production server upon commit. When you want to freeze the outsourcer from the project, you just change the password on Github and email accounts. The project manager retains access to pull to production. The outsourcer can make a commit and it appears directly on the development server. When the commit is approved by the project manager, he does a manual pull to the production machine.

How does the outsourcer work on the code?

Some programmers will have their own IDE setups that they like and know how to use. Eclipse is the best free IDE, while PHPStorm is probably the best commercial IDE. If they know how to pull down from Github and run the code on a local host, great. If they don't know how to do that, setup a development server in the cloud for them. Our stack include the Codiad IDE, which is an open source IDE similar to PHPStorm. TO access it, just go to /codiad/ on your development server, it's all setup already.

How do you run the test suite?

cd /var/www/html/wp-content/plugins/{project dir}
bin/codecept run -vvv --html

How do I see the test results?

They appear in the terminal, or at http://yourdomain.com/wp-content/plugins/{project dir}/tests/_output/
Usually in the terminal you can use the up arrow shortcut.

How do I commit to the repo?

git add --all
git commit -m "some kind of message!"
git push origin master

How do I log in to the WordPress site?

You can log in by using the FastRegister plugin. Just enter an email in the sidebar form and viola! You're logged in as an admin.

How do I log in to a terminal?

The stack will preconfigured a user called "freelancer" with a password "password". Just SSH into the system without a pem file.

Understanding DNS and localhost

The Domain Name System [DNS] is the system a browser uses to resolve domain names like generalchicken.net to IP addresses like 34.197.171.101. A server connected to the internet generally has one IP address, usually one main domain, but it can also have many subdomains. For instance, this server hosts the domains generalchicken.net and another blog, messagetothefish.com. Both have the same IP address, but different domain names.
When an HTTP or HTTPS request is sent to the server, the request should include the host header which indicates to the server what domain a resonse is expected from. A browser like Chrome or Firefox does this automatically for the user.
Internally, once the request is received by the server, a web server, like Apache, sends each request to a particular directory, based on what subdomain is named in the host header. From there, a file is activated, and in our case, passed to the PHP parser. For WordPress, it is called index.php. On most Ubuntu WordPress setups, the main domain root directory is usually set to:
//var/www/html/
and subdomains go from there:
//var/www/html/sub1/
//var/www/html/sub2/

These are the directories [for their respective domains], which will contain the WordPress root files, especially the index.php, the wp-config.php files, and the other directories like:
//var/www/html/wp-admin/
//var/www/html/wp-content/themes/
//var/www/html/wp-content/plugins/
//var/www/html/wp-includes/

Understanding this is important because if you are setting up a local development version of WordPress, you are going to want to be able to set subdomains up. Normally, you’ll have a sepearte wp-config.php file for each domain, specifying which database the domain points to.

The default setup on Ubuntu, is for the domain localhost to point to //var/www/html . Therefore, to access your local WordPress site, open a browser like Chrome, and got to http://localhost/ and you should get the WordPress install screen.

Another consideration is that most forms of testing work the best when you don’t have any state. That is, the database is either reset to a starting point, or totally scrubbed after each test. If you’re not used to this, you may accidentally delete anything you have on your site, especially if you’re using it for anything.

My personal setup is that I use http://localhost/ for unit testing, and I have another WordPress install, called http://laptop.dev/ where I have a database that doesn’t reset.

Directions: Setting up virtual hosts on Ubuntu 16.04 LTS.

Types of WordPress automated tests

state browser database SUT
WP Acceptance tests carries from test to test assumed headfull JS browser [ie. Selenium with Chrome] not reset after each test entire WP application executed with each browser call
Stateless acceptance tests tests run in isolation assumed headless JS browser [ie. PhantomJS] reset after each test entire WP application executed with each browser call
WP Unit tests tests run in isolation assume no browser or only cURL reset after each test WP application NOT executed
WP API tests tests run in isolation cURL only reset after each test WP application is executed