Rails: Things you must know about TDD and BDD by Srikant M. Mohapatra T T T T June 27, 2014May 15, 2015 Stay up to date with the latest tips and techniques of web and mobile app development services. Please leave this field empty Thanks for subscribing Andolasoft Blog! What does “Testing” means ? Testing of a product of services is an investigation to find out how well it is working against the expectation. Thus the quality of product can be assessed. Whether computer hardware or software development, testing is done at key checkpoints in the overall process to determine whether objectives are being met. What is TDD (Test-Driven Development) ? TDD is a way of designing the code by writing a test which expresses what you intend the code to do. It defines a set of rules for developing software in which test cases are written before any code and the only code written will be enough to make the tests pass. TDD is basically a software development technique that relies on the repetition of a very short development cycle. In this technique, first the developer starts by writing a failing automated test case (Red), implement the simplest solution that will pass the test cases (Green) and then finally improves or refactor the code (Refactor).”RED-GREEN-REFACTOR” is the main agenda for TDD. Tools to use: There are some popular gems available to implement TDD in Ruby on Rails like rspec-rails, capybara, factory_girl_rails, spork, launchy etc… Example: Below is the code snippet for writing controller tests, like this: describe ArticlesController do it "renders the index template" do get :index response.should render_template("index") end end What is BDD (Behavior-Driven Development)? BDD extends Test driven development by writing test cases in a way anyone can understand.With the help of BDD, software development is managed by both business interests and technical insight. It focuses and associates behavioral specifications with each unit of software under development. Basically BDD is an Agile software development technique that encourages collaboration between developers, QA and non-technical or business participants in a software project. It extends TDD by writing test cases in a natural language that non-programmers can read. In other way it is like story writing. The main thing to know is that BDD is meant to eliminate issues that TDD might cause. Tools to use: Some popular gems are available to implement BDD in Rails are rpsec-rails, factory_girl_rails, cucumber-rails, guard-cucumber, mocha etc… Example: Below is the code snippet for writing the BDD: #articles.feature Given an article exists called "Testing Demonstration" When I visit the list of articles Then I should see an article called "Testing Demonstration" #article_steps.rb Given /^an article exists called "(.+)"$/ do |title| FactoryGirl.create(:article, title: title) end When /^I visit the list of articles$/ do visit articles_path end Then /^I should see an article called "(.+)"$/ do |title| page.should have_content title end TDD or BDD, which is better? The main difference between TDD and BDD is the business readability factor. BDD’s main draw is that the specifications or features are separate from the test code, so the product owners can provide or review the specification without having to go through code. TDD has a similar mechanism, but instead you describe a step with a Describe, Context or It block that contains the business specification, and then immediately have the code that executes that statement. Few drawbacks of TDD are as follows: Big time investment: For the simple case you lose about 20% of the actual implementation, but for complicated cases you lose much more. Additional Complexity: For complex cases, test cases are harder to calculate. Design Impacts: Sometimes the design is not clear at the start and evolves as you go along – this will force you to redo your test which will generate a big time lose. Continuous Tweaking: For data structures and black box algorithms unit tests would be perfect, but for algorithms that tend to change, this can cause a big time investment that one might claim is not justified. Verdict If you are the sole developer and a product owner too, then you should go for TDD. It’s easier for a technical person to understand, which is an advantage in keeping things scoped and under control. Thus keeps you out of messing up with RegExs for test steps. On the flip side, you should go with BDD, if you are building this for a client, and they are hands-on with regard to the specifications. See Also : Security Checks you must do before Rails App release Hope you liked it. Go ahead and post your comments what you think about this? Related Posts: Ruby On Rails Integration Testing With Minitest And Capybara 5 Reasons Why Web Development is Faster With Ruby On Rails Why Rails Framework is Popular Among Ruby Developers?