Skip to main content

How did I start practising BDD?


In the beginning days, I have practiced TDD (Test Driven Development) using JUnit, I approached that I should test methods belong to a class. For example:

I have a class with some methods:

public class A{
 public void method1(){

 }

 public void method2(){

 }
}

And then, I wrote some test methods to check the corresponding ones, for example:

public class ATest{
 @Test
 public void testMethod1(){
  ....
  assertTrue(...);
  .....
  assertEquals(...);
 }

 @Test
 public void testMethod2(){
 }
}

After that, I know that a test method (ex: testMethod1) should just only test one thing, so I decided to write more methods for each case. It looks like the following:

@Test
public void testMethod1_When_Case1(){
 ....
 assertTrue(...);
}

@Test
public void testMethod1_When_Case2(){
 ....
 assertEquals(...);
}

However, it was not a really good approach because it seems that I just focused on test the functionality of the method of the class. With the TDD approach, I knew that I should test the behaviors of a class, not the methods that belong to this class. Because we all know the class's behaviors have represented the behaviors of our system.

Therefore, I would like to turn to a behavior testing approach; and BDD (behavior-driven development) is my response. Here is it:

- From the requirements, I call them are user stories in Agile. Something likes:
As a [Role]
I want [Feature]
So that I receive [Value]
I define some acceptance tests in order to know what exactly their values are. These acceptance tests have represented the behaviors of my system. Somethings likes:
Given [Context]
When [Event Occurs]
Then  [Outcome]
- From the acceptance tests, I started to build a class that implements the behaviors. With TDD and BDD  approach together, I start writing test code first. For example:

@Test
public void shouldReceiveOrDoSomethingWhenEvent1Occurs(){
}

@Test
public void shouldReceiveOrDoSomethingWhenEvent2Occurs(){
}

Yeah, that was all. Now, I follow this approach and I have a test case that represented the behavior of a class, not only the test for a method as previously.

References:
[1]. http://dannorth.net/introducing-bdd/
[2]. http://www.ryangreenhall.com/articles/bdd-by-example.html

Comments

Popular posts from this blog

Tip for resolving the compile errors when importing a Maven project in Eclipse

Sometimes, I import a existing Maven project into Eclipse and I get some compile errors related to "pom.xml", "facet version of Web", and  so on. It was really frustrating me because I even cleaned, built and updated the project many times but the errors still occurred. I accidentally found the following steps to resolve this issue but honestly I still don't know why. Step 1 : Delete the project that met the compile errors in Eclipse, but don't delete it on disk. Step 2 : Open the project (by Windows Explorer if you use Windows) and remove  file/folder ".classpath", ".settings" and ".project" . Step 3 : Import the project back into Eclipse. ---^0^--- Maven is a build automation tool used primarily for Java projects. Eclipse is an integrated development environment (IDE).

Monday vhandit #1

This is the first post in a series of articles called "Monday vhandit". You can go to the original post by clicking on each head title. Character encodings: essential concepts This article points out why Unicode matters and differentiates among concepts: character sets, coded character set (unit is code points), and character encoding. Explained from First Principles: the Internet The very structural and well-explained article contains almost concepts of the Internet. I really appreciated the author's effort put on that post. Dev Community - DevDojo I just joined this community. DevDojo is really a developer-oriented platform. It is very nice, easy, fast, and sufficient to write (Markdown supported) and search for a post. The best of it, you also have a personal blog for your posts at "<your_username>.devdojo.com". My username is vnnvanhuong Everything you need to know about HTTP security headers A good collection of HTTP security-related headers. Moreover...

Projects Ownership

Developers should be informed transparently about the next things that they are going to do since it impacts their mentality as well as their accountabilities. A view of Vung Tau beach First thing first, the Product Owner plays a very important role in understanding the business of the projects clearly and planning the User Stories for Development Teams. For Development Teams, we have two roles related to a project including Owner and Maintainer. The following are the definition and responsibilities for each role: Project Owner The Owner is normally assigned to the team that created the project at the beginning. It is known as the long-term project of the team. Therefore, the members of the Owner have almost knowledge of the projects including the history (i.e decisions made), business logic, and technologies used.  - Maintain a good system design (code) of the projects. Therefore, they are mandatory to review code (pull requests) from other teams. - Maintain the related documents ...

Selenium - Override javascript functions to ignore downloading process

I have got an issue with downloading process on IE 8. This browser blocks my automatic-download functionality on my app so that I could not work with my test case any more after that. In my case, I didn't care about the file is downloaded or not, I just focus on the result after downloading process finished successfully. Therefore, I found a solution to ignore this process so that I can work normally. I use Primefaces, here is the remote command to trigger the download process <p:remoteCommand name="cmdGenerateDocument" actionListener="#{logic.onGenerateDocument}" update="xrflDocumentCreationPanel" oncomplete="clickDownloadButton();"/> The following is my test case: @Test public void shouldUpdateStep6ToWarningIfStep1IsValidAfterFinished(){ MainPage mainPage = new MainPage(); waitForLoading(mainPage.getDriver()); EmployeeDetailPage empDetailPage = new EmployeeDetailPage(); waitForLoading(empDetailPage.getDriver()); e...