Java Unit Test and Coverage Introduction


Published on

Published in: Technology, Education
  • Be the first to comment

No Downloads
Total views
On SlideShare
From Embeds
Number of Embeds
Embeds 0
No embeds

No notes for slide

Java Unit Test and Coverage Introduction

  1. 1. Java Unit Test and Coverage IntroductionAlex Su2010/07/21 Copyright 2010 TCloud Computing Inc.
  2. 2. Agenda•Test-driven development•Junit •Ant Integration•Mock Object • Mockito•Code Coverage Analysis•Coverage Tool • Emma • Cobertura•Case Study Trend Micro Confidential
  3. 3. Test-driven developmentTest-driven development (TDD) is a software development technique that relies on the repetition of a very short development cycle•Add a test•Run all tests and see if the new one fails•Write some code•Run the automated tests and see them succeed•Refactor code Trend Micro Confidential
  4. 4. Test-driven development - ScenarioGiven/When/ThenExample 1: New lists are emptyGiven a new listThen the list should be empty.Example 2: Lists with things in them are not empty.Given a new listWhen we add an objectThen the list should not be empty. Trend Micro Confidential
  5. 5. Test-driven development - Scenarioclass ListTest { @Test public void shouldKnowWhetherItIsEmpty() { List<String> list1 = new ArrayList<String>(); assertTrue(list1.isEmpty()); List<String> list2 = new ArrayList<String>(); list2.add("element"); assertFalse(list2.isEmpty()); }} Trend Micro Confidential
  6. 6. Test-driven development Trend Micro Confidential
  7. 7. JUnit• JUnit is a unit testing framework for the Java programming language.• JUnit is linked as a JAR at compile-time; the framework resides under packages junit.framework for JUnit 3.8 and earlier and under org.junit for JUnit 4 and later. Trend Micro Confidential
  8. 8. JUnit• Test Runner A Runner runs tests. You will need to subclass Runner when using RunWith to invoke a custom runner.• Test Fixture A test fixture represents the preparation needed to perform one or more tests• Test Case A test case defines the fixture to run multiple tests.• Test Suite A Test Suite is a Composite of Tests. It runs a collection of test cases. Trend Micro Confidential
  9. 9. Junit – Test Result• Success• Failure A failure is when one of your assertions fails, and your JUnit test notices and reports the fact.• Error An error is when some other Exception occurs--one you havent tested for and didnt expect, such as a NullPointerException or an ArrayIndexOutOfBoundsException. Trend Micro Confidential
  10. 10. Junit – Annotation• @BeforeClass• @AfterClass• @Before• @After• @Test• @Ignore Trend Micro Confidential
  11. 11. JUnitpublic class DummyTest { private static List<String> list; @BeforeClass public static void beforeClass() { list = new ArrayList<String>(); } @AfterClass public static void afterClass() { list = null; } @Before public void before() { list.add("Alex"); } @After public void after() { list.remove("Alex"); } @Test public void getElement() { String element = list.get(0); assertEquals(element, "Alex"); } @Ignore("Not Ready to Run") @Test public void notRun() { assertEquals(list.size(), 2); } @Test(expected = IndexOutOfBoundsException.class) public void getElementWithException() { list.get(1); }} Trend Micro Confidential
  12. 12. JUnit@RunWith(Suite.class)@SuiteClasses({DummyTest1.class, DummyTest2.class})public class DummyTestSuite {} Trend Micro Confidential
  13. 13. JUnit@RunWith(SpringJUnit4ClassRunner.class)@ContextConfiguration(locations ={ "classpath:appContext.xml" })public class DummyTest { @Resource private DummyService dummyService; @Test public void createDummy() { Dummy dummy = new Dummy(); dummy.setId(ID); dummy.setName("Hermione Granger"); dummy.setDescription("Gryffindor"); dummyService.createDummy(dummy); dummy = dummyService.getDummy(ID); assertNotNull(dummy); }} Trend Micro Confidential
  14. 14. Junit – Ant Integration<junit showoutput="${build.test.dir}" printsummary="on"fork="yes" haltonfailure="false> <classpath refid="classpath" /> <formatter type="xml" /> <batchtest todir="${build.test.dir}"> <fileset dir="${test.dir}"> <include name="**/*" /> </fileset> </batchtest></junit><junitreport todir="${doc.test.dir}"> <fileset dir="${build.test.dir}"> <include name="**/TEST-*.xml" /> </fileset> <report format="frames" todir="${doc.test.dir}" /></junitreport> Trend Micro Confidential
  15. 15. Mock Object•supplies non-deterministic results (e.g. the current time or the current temperature);•has states that are difficult to create or reproduce (e.g. a network error);•is slow (e.g. a complete database, which would have to be initialized before the test);•does not yet exist or may change behavior;•would have to include information and methods exclusively for testing purposes (and not for its actual task). Trend Micro Confidential
  16. 16. Mock Object - Mockito•Argument matchers•Verifying exact number of invocations / at least x / never•Verification in order•Shorthand for mocks creation - @Mock annotation•Stubbing consecutive calls•Spying on real objects•Aliases for behavior driven development Trend Micro Confidential
  17. 17. Mock Object - Mockitopublic class ListTest { private List<String> mockedList; @Before public void initMocks() { mockedList = mock(List.class);given(mockedList.get(0)).willReturn("first", "second"); given(mockedList.get(1)).willThrow(newIndexOutOfBoundsException()); } @Test public void getList() { assertEquals("first", mockedList.get(0)); assertEquals("second", mockedList.get(0)); } @Test(expected = IndexOutOfBoundsException.class) public void getListWithException() { mockedList.get(1); }} Trend Micro Confidential
  18. 18. Code Coverage Analysis•Finding areas of a program not exercised by a set of test cases.•Creating additional test cases to increase coverage.•Determining a quantitative measure of code coverage, which is an indirect measure of quality.•Identifying redundant test cases that do not increase coverage. Trend Micro Confidential
  19. 19. Code Coverage Analysis•Basic Metrics •Statement Coverage(Line) •Basic Block Coverage •Decision Coverage(Branch) •Condition Coverage •Multiple Condition Coverage •Condition/Decision Coverage •Modified Condition/Decision Coverage •Path Coverage Trend Micro Confidential
  20. 20. Code Coverage Analysis•Statement Coverage(Line)•Basic Block Coverage•Decision Coverage(Branch)•Condition Coverage•Multiple Condition Coverageboolean a = true, b = true;if(a && b) { System.out.println("true");} else { System.out.println("false");} Trend Micro Confidential
  21. 21. Code Coverage Analysis•Condition/Decision Coverage(C/DC)•Modified Condition/Decision Coverage(MC/DC)boolean a = true, b = true;if(a && b) { System.out.println("true");} else { System.out.println("false");}if(a || b) { System.out.println("true");} else { System.out.println("false");} Trend Micro Confidential
  22. 22. Code Coverage Analysis•Path Coverage Y A = 3 and X = 5 A>1 A = 0 and X = 3 A = 0 and X = 0 N X=0 A = 2 and X = 0 A=2 Y or X>1 N X = 20 print x Trend Micro Confidential
  23. 23. Code Coverage Analysis•Other Metrics •Function Coverage •Data Flow Coverage •Loop Coverage •Race Coverage •Relational Operator Coverage Trend Micro Confidential
  24. 24. Coverage Tool•Instrumentation • Source code instrumentation • Bytecode instrumentation • Runtime instrumentation Trend Micro Confidential
  25. 25. Coverage Tool Possible feature Runtime Bytecode Source codeGathers method coverage yes yes yesGathers statement coverage line only yes yesGathers branch coverage indirectly yes yesCan work without source yes yes noRequires separate build no no yesRequires specialised runtime yes not accurate noView coverage data inline not accurate yes yeswith sourceSource level directives to no no yescontrol coverage gatheringRuntime performace high impact variable variableContainer friendly no not accurate yes Trend Micro Confidential
  26. 26. Coverage Tool•Reports are filterable so you can tell what needs to be evaluated for code coverage.•offline and on-the-fly instrumentation.•Ant integration.•JUnit integration. Trend Micro Confidential
  27. 27. Coverage Tool - Emma•Last update : 2005-06-13•Stats on both class and method coverage•Partial/fractional line coverages is unique trait - shown in yellow when there are multiple conditions in a conditional block•Stricter code coverage.•Integration with Eclipse available -•Better documentation than cobertura.•Instrumentation process is faster than cobertura.•Standalone library and does not have any external dependencies.•Common public license 1.0 friendlier that GPL. Trend Micro Confidential
  28. 28. Coverage Tool - Cobertura• Last update : 2010-03-03• GPLd version of JCoverage (which is commercial).• Prettier reports.• Branch/block and line coverages only - no class or method level coverage.• How many times a line has been executed• <cobertura-check> where one can specify percentage of coverage thats a MUST or else build fails.• Data merge feature - good for QA labs... for merging coverage data to prepare historical trend graphs.• Depends on other third party libraries.• Integration with Eclipse available - Trend Micro Confidential
  29. 29. Coverage Tool – Comparsion(Exception)• Source CodeString str = "abc";System.out.println(str.substring(5));•Decompile ResultString str = "abc";System.out.println(str.substring(5)); Trend Micro Confidential
  30. 30. Coverage Tool - Comparsion(Exception)• Emmaboolean aflag[] = ($VRc != null ? $VRc : $VRi())[3];String s = "abc";System.out.println(s.substring(5));aflag[0] = true; Trend Micro Confidential
  31. 31. Coverage Tool - Comparsion(Exception)• Coberturaboolean flag = false;int __cobertura__branch__number__ = -1;TouchCollector.touch("tcloud.dummy.service.CoverageTestMain", 25);String str = "abc";TouchCollector.touch("tcloud.dummy.service.CoverageTestMain", 26);System.out.println(str.substring(5));TouchCollector.touch("tcloud.dummy.service.CoverageTestMain", 27); Trend Micro Confidential
  32. 32. Coverage Tool - Comparsion(Exception)•;;String str = "abc";;System.out.println(str.substring(5)); Trend Micro Confidential
  33. 33. Coverage Tool – Comparsion(Loop)•Source CodeList<String> list = new ArrayList<String>();for(String element : list) { System.out.println(element);}• Decompile resultString element;for(Iterator iterator = list.iterator(); iterator.hasNext(); System.out.println(element)) element = (String); Trend Micro Confidential
  34. 34. Coverage Tool - Comparsion(Loop)• Emmaboolean aflag[] = ($VRc != null ? $VRc : $VRi())[4];List list = new ArrayList();Iterator iterator = list.iterator();aflag[0] = true;do{ aflag[2] = true; if(iterator.hasNext()) { String s = (String); System.out.println(s); aflag[1] = true; } else { break; }} while(true);aflag[3] = true; Trend Micro Confidential
  35. 35. Coverage Tool - Comparsion(Loop)• Coberturaboolean flag = false;int __cobertura__branch__number__ = -1;TouchCollector.touch("tcloud.dummy.service.CoverageTestMain", 36);List list = new ArrayList();TouchCollector.touch("tcloud.dummy.service.CoverageTestMain", 37);Iterator iterator = list.iterator();do{ TouchCollector.touch("tcloud.dummy.service.CoverageTestMain", 37); __cobertura__line__number__ = 37; __cobertura__branch__number__ = 0; if(iterator.hasNext()) { if(__cobertura__branch__number__ >= 0) { TouchCollector.touchJump("tcloud.dummy.service.CoverageTestMain", __cobertura__line__number__, __cobertura__branch__numb er__, false); __cobertura__branch__number__ = -1; } String element = (String); TouchCollector.touch("tcloud.dummy.service.CoverageTestMain", 38); System.out.println(element); } else { if(__cobertura__line__number__ == 37 && __cobertura__branch__number__ == 0) { TouchCollector.touchJump("tcloud.dummy.service.CoverageTestMain", __cobertura__line__number__, __cobertura__branch__numb er__, true); __cobertura__branch__number__ = -1; } TouchCollector.touch("tcloud.dummy.service.CoverageTestMain", 40); return; }} while(true); Trend Micro Confidential
  36. 36. Coverage Tool - Comparsion(Loop)•;;List list = new ArrayList();;String element;for(Iterator iterator = list.iterator(); iterator.hasNext(); System.out.println(element)) { element = (String);; } Trend Micro Confidential
  37. 37. Coverage Tool - Comparsion(Loop)• Clover with decompile result Iterator iterator;;; List list = new ArrayList();;; iterator = list.iterator();_L4: if(iterator.hasNext()) { __CLR3_0_2166166gbu71moi.R.iget(1539); } else { __CLR3_0_2166166gbu71moi.R.iget(1540); return; } if(true) goto _L2; else goto _L1_L1: break; /* Loop/switch isnt completed */_L2:; String element = (String); System.out.println(element); if(true) goto _L4; else goto _L3_L3: Trend Micro Confidential
  38. 38. Case Study Trend Micro Confidential
  39. 39. THANK YOU! Trend Micro Confidential