Unit testing with JUnit

Thomas Zimmermann
Thomas ZimmermannResearcher at Microsoft Research
Unit testing with JUnit
       Tom Zimmermann
Testing


Testing is the activity of finding out whether a
piece of code (a method, class, or program)
produces the intended behavior.




                               taken from “Objects First with Java”
Edsger Dijkstra

        Program testing can be used
     to show the presence of bugs, but
       never to show their absence!
I don’t make
  mistakes!
I don’t make
  mistakes!
Test phases
Unit testing on individual units of
source code (=smallest testable part).

Integration testing on groups of
individual software modules.

System testing on a complete,
integrated system (evaluate
compliance with requirements)
JUnit




Kent Beck           Erich Gamma
JUnit




        taken from “JUnit: A Cook’s Tour”
Tests in JUnit
Tests are realized as public void testX() methods.
A test typically calls a few methods, then checks if
the state matches the expectation. If not, it fails.
Example: Call empty() on the shopping cart and
check the state with isEmpty()
// Tests the emptying of the cart.
public void testEmpty() {

    _bookCart.empty();

    assertTrue(_bookCart.isEmpty());
}
JUnit Checklist

 Initialize
 Write test cases
 Write a test suite
 Execute test suite
Example: Shopping cart


                   Add product
               1
Example: Shopping cart


                          Add product
                      1




     Remove product
 2
Example: Shopping cart
    Set of products
1




                                Add product
                            1




           Remove product
       2
Example: Shopping cart
    Set of products
1

    Number of products
2



                                Add product
                            1




           Remove product
       2
Example: Shopping cart
    Set of products
1

    Number of products
2

    Balance
3

                                Add product
                            1




           Remove product
       2
Part 1: Initialize
Constructor + Set up and tear down of fixture.
import junit.framework.Test;
import junit.framework.TestCase;
import junit.framework.TestSuite;

public class ShoppingCartTest extends TestCase {


   private ShoppingCart _bookCart;


   // Creates a new test case

   public ShoppingCartTest(String name) {

   
 super(name);

   }
Test fixture
// Creates test environment (fixture).
// Called before every testX() method.
protected void setUp() {

    _bookCart = new ShoppingCart();


   Product book = new Product(quot;Harry Potterquot;, 23.95);

   _bookCart.addItem(book);
}

// Releases test environment (fixture).
// Called after every testX() method.
protected void tearDown() {

    _bookCart = null;
}
Part 2: Write test cases
Help methods inherited from TestCase:
            – triggers a failure named msg
fail(msg)

                      – triggers a failure, when condition b is false
assertTrue(msg, b)

                               – triggers a failure, when v1 ≠ v2
assertEquals(msg, v1, v2)

                                  – triggers a failure, when |v1−v2|> ε
assertEquals(msg, v1, v2, ε)

                            – triggers a failure, when object is not null
assertNull(msg, object)

                                – triggers a failure, when object is null
assertNonNull(msg, object)

The parameter msg is optional.
Test: Add product
// Tests adding a product to the cart.
public void testProductAdd() {

    Product book = new Product(quot;Refactoringquot;, 53.95);

    _bookCart.addItem(book);


   assertTrue(_bookCart.contains(book));


   double expected = 23.95 + book.getPrice();

   double current = _bookCart.getBalance();


   assertEquals(expected, current, 0.0);


   int expectedCount = 2;

   int currentCount = _bookCart.getItemCount();


   assertEquals(expectedCount, currentCount);
}
Test: Add product
// Tests adding a product to the cart.
public void testProductAdd() {

    Product book = new Product(quot;Refactoringquot;, 53.95);

    _bookCart.addItem(book);


   assertTrue(_bookCart.contains(book));


   double expected = 23.95 + book.getPrice();

   double current = _bookCart.getBalance();


   assertEquals(expected, current, 0.0);


   int expectedCount = 2;

   int currentCount = _bookCart.getItemCount();


   assertEquals(expectedCount, currentCount);
}
Test: Remove product
// Tests removing a product from the cart.
public void testProductRemove() throws NotFoundException {

    Product book = new Product(quot;Harry Potterquot;, 23.95);

    _bookCart.removeItem(book);


   assertTrue(!_bookCart.contains(book));


   double expected = 23.95 - book.getPrice();

   double current = _bookCart.getBalance();


   assertEquals(expected, current, 0.0);


   int expectedCount = 0;

   int currentCount = _bookCart.getItemCount();


   assertEquals(expectedCount, currentCount);
}
Test: Remove product
// Tests removing a product from the cart.
public void testProductRemove() throws NotFoundException {

    Product book = new Product(quot;Harry Potterquot;, 23.95);

    _bookCart.removeItem(book);


   assertTrue(!_bookCart.contains(book));


   double expected = 23.95 - book.getPrice();

   double current = _bookCart.getBalance();


   assertEquals(expected, current, 0.0);


   int expectedCount = 0;

   int currentCount = _bookCart.getItemCount();


   assertEquals(expectedCount, currentCount);
}
Test: Exception handling

// Tests removing an unknown product from the cart.
public void testProductNotFound() {

    try {

    
 Product book = new Product(quot;Bonesquot;, 4.95);

    
 _bookCart.removeItem(book);


    
 fail(quot;Should raise a NotFoundExceptionquot;);

    } catch (NotFoundException nfe) {

    
 // Should always take this path

    }
}
Test: Exception handling

// Tests removing an unknown product from the cart.
public void testProductNotFound() {

    try {

    
 Product book = new Product(quot;Bonesquot;, 4.95);

    
 _bookCart.removeItem(book);


    
 fail(quot;Should raise a NotFoundExceptionquot;);

    } catch (NotFoundException nfe) {

    
 // Should always take this path

    }
}
Part 3: Write a test suite
The method suite() assembles the test methods
into a test suite – using reflection all methods
named testX() will be part of the test suite.
public static Test suite() {

    // Here: add all testX() methods to the suite (reflection).
    TestSuite suite = new TestSuite(ShoppingCartTest.class);

    //   Alternative: add methods manually (prone to error)
    //   TestSuite suite = new TestSuite();
    //   suite.addTest(new ShoppingCartTest(quot;testEmptyquot;));
    //   suite.addTest(new ShoppingCartTest(quot;testProductAddquot;));
    //   suite.addTest(...);

    return suite;
}
Part 4: Execute test suite
// Returns the name of the test case.
public String toString() {
  return getName();
}

// Main method: Call GUI
public static void main(String args[]) {
  String[] tcName = { ShoppingCartTest.class.getName() };
  junit.swingui.TestRunner.main(tcName);
  // junit.textui.TestRunner.main(tcName);
}


Execute the main() method to run the tests:
$ java ShoppingCartTest
Demo
I know I should test,
   but everything?
Best practices

Tests should be written before the code.
Test everything that could reasonably break.
If it can't break on its own, it's too simple to
break (like most get and set methods).
Run all your unit tests as often as possible.
Best practices (cont.)

                     Whenever you are tempted to
                 type something into a print statement
                or a debugger expression, write it as
                         a test instead.



Martin Fowler
Bits of research
Delta debugging




   Yesterday, my
 program worked.
Today, it does not.

                      Zeller (ESEC/FSE 1999), Burger et al. (ETX 2003)
Delta debugging




   Yesterday, my                     The change in
 program worked.                     Line 42 makes
Today, it does not.                 the program fail.
                      Zeller (ESEC/FSE 1999), Burger et al. (ETX 2003)
Continuous testing


 Continuously run tests in the background
   rapid feedback about test failures




                    Saff and Ernst (ISSRE 2003, ISSTA 2004)
Continuous testing


 Continuously run tests in the background
   rapid feedback about test failures




                    Saff and Ernst (ISSRE 2003, ISSTA 2004)
Summary
Testing                 Literature @ junit.org
  Unit testing            JUnit Test Infected.
  Integration testing     JUnit A Cook's Tour.
  System testing
                        Self-study questions
JUnit                     How can we test protected
  Test cases              and private methods?
  Test suites             What distinguishes a good
  Fixtures                test suite from a bad one?
                          Think of situations that are
Best practices            difficult to test.
1 of 36

Recommended

JUNit PresentationJUNit Presentation
JUNit PresentationAnimesh Kumar
5.4K views27 slides
05 junit05 junit
05 junitmha4
671 views27 slides
Java Unit TestingJava Unit Testing
Java Unit TestingNayanda Haberty
1.5K views36 slides
JUnit PresentationJUnit Presentation
JUnit Presentationpriya_trivedi
17.7K views26 slides

More Related Content

What's hot(20)

JUnit- A Unit Testing FrameworkJUnit- A Unit Testing Framework
JUnit- A Unit Testing Framework
Onkar Deshpande7.6K views
JunitJunit
Junit
Manav Prasad2.4K views
JUnit & Mockito, first stepsJUnit & Mockito, first steps
JUnit & Mockito, first steps
Renato Primavera8.5K views
Mocking in Java with MockitoMocking in Java with Mockito
Mocking in Java with Mockito
Richard Paul14.3K views
Unit testing with JUnitUnit testing with JUnit
Unit testing with JUnit
Pokpitch Patcharadamrongkul1.2K views
JUnit 5JUnit 5
JUnit 5
Scott Leberknight4.4K views
Understanding Unit TestingUnderstanding Unit Testing
Understanding Unit Testing
ikhwanhayat6.2K views
Why unit testinglWhy unit testingl
Why unit testingl
Priya Sharma1.8K views
Unit Tests And Automated TestingUnit Tests And Automated Testing
Unit Tests And Automated Testing
Lee Englestone7.7K views
MockitoMockito
Mockito
sudha rajamanickam7.1K views
An Introduction to Unit TestingAn Introduction to Unit Testing
An Introduction to Unit Testing
Joe Tremblay3.6K views
Unit TestingUnit Testing
Unit Testing
Sergey Podolsky2.1K views
Unit testing best practicesUnit testing best practices
Unit testing best practices
nickokiss22.3K views
N Unit PresentationN Unit Presentation
N Unit Presentation
priya_trivedi5K views
Unit and integration TestingUnit and integration Testing
Unit and integration Testing
David Berliner23.9K views
Workshop   unit testWorkshop   unit test
Workshop unit test
Francesco Garavaglia1.1K views
Unit Testing in JavaUnit Testing in Java
Unit Testing in Java
Ahmed M. Gomaa1.9K views
JunitJunit
Junit
FAROOK Samath6.9K views
Unit testingUnit testing
Unit testing
Slideshare2.2K views
Unit testing with javaUnit testing with java
Unit testing with java
Dinuka Malalanayake1.7K views

Similar to Unit testing with JUnit

Unit TestingUnit Testing
Unit TestingSubhash Chandran
2.3K views23 slides
3 j unit3 j unit
3 j unitkishoregali
1.8K views73 slides
J unit presentationJ unit presentation
J unit presentationPriya Sharma
1.5K views26 slides

Similar to Unit testing with JUnit(20)

Junit With EclipseJunit With Eclipse
Junit With Eclipse
Sunil kumar Mohanty1.2K views
Unit TestingUnit Testing
Unit Testing
Subhash Chandran2.3K views
3 j unit3 j unit
3 j unit
kishoregali1.8K views
GeeCON 2012 Bad Tests, Good TestsGeeCON 2012 Bad Tests, Good Tests
GeeCON 2012 Bad Tests, Good Tests
Tomek Kaczanowski1.1K views
Confitura 2012 Bad Tests, Good TestsConfitura 2012 Bad Tests, Good Tests
Confitura 2012 Bad Tests, Good Tests
Tomek Kaczanowski645 views
J unit presentationJ unit presentation
J unit presentation
Priya Sharma1.5K views
Junit4&testng presentationJunit4&testng presentation
Junit4&testng presentation
Sanjib Dhar1.8K views
JunitJunit
Junit
Abdullah Shahneel48 views
8-testing.pptx8-testing.pptx
8-testing.pptx
ssuserd0fdaa1 view
Pragmatic unittestingwithj unitPragmatic unittestingwithj unit
Pragmatic unittestingwithj unit
liminescence324 views
How to write clean testsHow to write clean tests
How to write clean tests
Danylenko Max55 views
TestNG vs JunitTestNG vs Junit
TestNG vs Junit
Büşra İçöz187 views
Security TestingSecurity Testing
Security Testing
Kiran Kumar5.3K views
Test Driven DevelopmentTest Driven Development
Test Driven Development
Milfont Consulting924 views
Junit 4.0Junit 4.0
Junit 4.0
pallavikhandekar2126.4K views
Unit testingUnit testing
Unit testing
jeslie395 views
Junit and testNGJunit and testNG
Junit and testNG
Марія Русин2K views

More from Thomas Zimmermann(20)

Software Analytics = Sharing InformationSoftware Analytics = Sharing Information
Software Analytics = Sharing Information
Thomas Zimmermann3.3K views
MSR 2013 PreviewMSR 2013 Preview
MSR 2013 Preview
Thomas Zimmermann21.8K views
Analytics for smarter software development Analytics for smarter software development
Analytics for smarter software development
Thomas Zimmermann2.6K views
Klingon Countdown TimerKlingon Countdown Timer
Klingon Countdown Timer
Thomas Zimmermann1.3K views
Data driven games user researchData driven games user research
Data driven games user research
Thomas Zimmermann1.5K views
Security trend analysis with CVE topic modelsSecurity trend analysis with CVE topic models
Security trend analysis with CVE topic models
Thomas Zimmermann1.5K views
Analytics for software developmentAnalytics for software development
Analytics for software development
Thomas Zimmermann4.6K views
Cross-project defect predictionCross-project defect prediction
Cross-project defect prediction
Thomas Zimmermann1.9K views
Quality of Bug Reports in Open SourceQuality of Bug Reports in Open Source
Quality of Bug Reports in Open Source
Thomas Zimmermann1.6K views
Meet Tom and his FishMeet Tom and his Fish
Meet Tom and his Fish
Thomas Zimmermann1.5K views
Got Myth? Myths in Software EngineeringGot Myth? Myths in Software Engineering
Got Myth? Myths in Software Engineering
Thomas Zimmermann5.9K views

Recently uploaded(20)

METHOD AND SYSTEM FOR PREDICTING OPTIMAL LOAD FOR WHICH THE YIELD IS MAXIMUM ...METHOD AND SYSTEM FOR PREDICTING OPTIMAL LOAD FOR WHICH THE YIELD IS MAXIMUM ...
METHOD AND SYSTEM FOR PREDICTING OPTIMAL LOAD FOR WHICH THE YIELD IS MAXIMUM ...
Prity Khastgir IPR Strategic India Patent Attorney Amplify Innovation22 views
ThroughputThroughput
Throughput
Moisés Armani Ramírez25 views
Java Platform Approach 1.0 - Picnic MeetupJava Platform Approach 1.0 - Picnic Meetup
Java Platform Approach 1.0 - Picnic Meetup
Rick Ossendrijver20 views
Liqid: Composable CXL PreviewLiqid: Composable CXL Preview
Liqid: Composable CXL Preview
CXL Forum114 views
Green Leaf Consulting: Capabilities DeckGreen Leaf Consulting: Capabilities Deck
Green Leaf Consulting: Capabilities Deck
GreenLeafConsulting147 views

Unit testing with JUnit

  • 1. Unit testing with JUnit Tom Zimmermann
  • 2. Testing Testing is the activity of finding out whether a piece of code (a method, class, or program) produces the intended behavior. taken from “Objects First with Java”
  • 3. Edsger Dijkstra Program testing can be used to show the presence of bugs, but never to show their absence!
  • 4. I don’t make mistakes!
  • 5. I don’t make mistakes!
  • 6. Test phases Unit testing on individual units of source code (=smallest testable part). Integration testing on groups of individual software modules. System testing on a complete, integrated system (evaluate compliance with requirements)
  • 7. JUnit Kent Beck Erich Gamma
  • 8. JUnit taken from “JUnit: A Cook’s Tour”
  • 9. Tests in JUnit Tests are realized as public void testX() methods. A test typically calls a few methods, then checks if the state matches the expectation. If not, it fails. Example: Call empty() on the shopping cart and check the state with isEmpty() // Tests the emptying of the cart. public void testEmpty() { _bookCart.empty(); assertTrue(_bookCart.isEmpty()); }
  • 10. JUnit Checklist Initialize Write test cases Write a test suite Execute test suite
  • 11. Example: Shopping cart Add product 1
  • 12. Example: Shopping cart Add product 1 Remove product 2
  • 13. Example: Shopping cart Set of products 1 Add product 1 Remove product 2
  • 14. Example: Shopping cart Set of products 1 Number of products 2 Add product 1 Remove product 2
  • 15. Example: Shopping cart Set of products 1 Number of products 2 Balance 3 Add product 1 Remove product 2
  • 16. Part 1: Initialize Constructor + Set up and tear down of fixture. import junit.framework.Test; import junit.framework.TestCase; import junit.framework.TestSuite; public class ShoppingCartTest extends TestCase { private ShoppingCart _bookCart; // Creates a new test case public ShoppingCartTest(String name) { super(name); }
  • 17. Test fixture // Creates test environment (fixture). // Called before every testX() method. protected void setUp() { _bookCart = new ShoppingCart(); Product book = new Product(quot;Harry Potterquot;, 23.95); _bookCart.addItem(book); } // Releases test environment (fixture). // Called after every testX() method. protected void tearDown() { _bookCart = null; }
  • 18. Part 2: Write test cases Help methods inherited from TestCase: – triggers a failure named msg fail(msg) – triggers a failure, when condition b is false assertTrue(msg, b) – triggers a failure, when v1 ≠ v2 assertEquals(msg, v1, v2) – triggers a failure, when |v1−v2|> ε assertEquals(msg, v1, v2, ε) – triggers a failure, when object is not null assertNull(msg, object) – triggers a failure, when object is null assertNonNull(msg, object) The parameter msg is optional.
  • 19. Test: Add product // Tests adding a product to the cart. public void testProductAdd() { Product book = new Product(quot;Refactoringquot;, 53.95); _bookCart.addItem(book); assertTrue(_bookCart.contains(book)); double expected = 23.95 + book.getPrice(); double current = _bookCart.getBalance(); assertEquals(expected, current, 0.0); int expectedCount = 2; int currentCount = _bookCart.getItemCount(); assertEquals(expectedCount, currentCount); }
  • 20. Test: Add product // Tests adding a product to the cart. public void testProductAdd() { Product book = new Product(quot;Refactoringquot;, 53.95); _bookCart.addItem(book); assertTrue(_bookCart.contains(book)); double expected = 23.95 + book.getPrice(); double current = _bookCart.getBalance(); assertEquals(expected, current, 0.0); int expectedCount = 2; int currentCount = _bookCart.getItemCount(); assertEquals(expectedCount, currentCount); }
  • 21. Test: Remove product // Tests removing a product from the cart. public void testProductRemove() throws NotFoundException { Product book = new Product(quot;Harry Potterquot;, 23.95); _bookCart.removeItem(book); assertTrue(!_bookCart.contains(book)); double expected = 23.95 - book.getPrice(); double current = _bookCart.getBalance(); assertEquals(expected, current, 0.0); int expectedCount = 0; int currentCount = _bookCart.getItemCount(); assertEquals(expectedCount, currentCount); }
  • 22. Test: Remove product // Tests removing a product from the cart. public void testProductRemove() throws NotFoundException { Product book = new Product(quot;Harry Potterquot;, 23.95); _bookCart.removeItem(book); assertTrue(!_bookCart.contains(book)); double expected = 23.95 - book.getPrice(); double current = _bookCart.getBalance(); assertEquals(expected, current, 0.0); int expectedCount = 0; int currentCount = _bookCart.getItemCount(); assertEquals(expectedCount, currentCount); }
  • 23. Test: Exception handling // Tests removing an unknown product from the cart. public void testProductNotFound() { try { Product book = new Product(quot;Bonesquot;, 4.95); _bookCart.removeItem(book); fail(quot;Should raise a NotFoundExceptionquot;); } catch (NotFoundException nfe) { // Should always take this path } }
  • 24. Test: Exception handling // Tests removing an unknown product from the cart. public void testProductNotFound() { try { Product book = new Product(quot;Bonesquot;, 4.95); _bookCart.removeItem(book); fail(quot;Should raise a NotFoundExceptionquot;); } catch (NotFoundException nfe) { // Should always take this path } }
  • 25. Part 3: Write a test suite The method suite() assembles the test methods into a test suite – using reflection all methods named testX() will be part of the test suite. public static Test suite() { // Here: add all testX() methods to the suite (reflection). TestSuite suite = new TestSuite(ShoppingCartTest.class); // Alternative: add methods manually (prone to error) // TestSuite suite = new TestSuite(); // suite.addTest(new ShoppingCartTest(quot;testEmptyquot;)); // suite.addTest(new ShoppingCartTest(quot;testProductAddquot;)); // suite.addTest(...); return suite; }
  • 26. Part 4: Execute test suite // Returns the name of the test case. public String toString() { return getName(); } // Main method: Call GUI public static void main(String args[]) { String[] tcName = { ShoppingCartTest.class.getName() }; junit.swingui.TestRunner.main(tcName); // junit.textui.TestRunner.main(tcName); } Execute the main() method to run the tests: $ java ShoppingCartTest
  • 27. Demo
  • 28. I know I should test, but everything?
  • 29. Best practices Tests should be written before the code. Test everything that could reasonably break. If it can't break on its own, it's too simple to break (like most get and set methods). Run all your unit tests as often as possible.
  • 30. Best practices (cont.) Whenever you are tempted to type something into a print statement or a debugger expression, write it as a test instead. Martin Fowler
  • 32. Delta debugging Yesterday, my program worked. Today, it does not. Zeller (ESEC/FSE 1999), Burger et al. (ETX 2003)
  • 33. Delta debugging Yesterday, my The change in program worked. Line 42 makes Today, it does not. the program fail. Zeller (ESEC/FSE 1999), Burger et al. (ETX 2003)
  • 34. Continuous testing Continuously run tests in the background rapid feedback about test failures Saff and Ernst (ISSRE 2003, ISSTA 2004)
  • 35. Continuous testing Continuously run tests in the background rapid feedback about test failures Saff and Ernst (ISSRE 2003, ISSTA 2004)
  • 36. Summary Testing Literature @ junit.org Unit testing JUnit Test Infected. Integration testing JUnit A Cook's Tour. System testing Self-study questions JUnit How can we test protected Test cases and private methods? Test suites What distinguishes a good Fixtures test suite from a bad one? Think of situations that are Best practices difficult to test.