• Like
  • Save
Java Unit Test and Coverage Introduction
Upcoming SlideShare
Loading in...5
×
 

Java Unit Test and Coverage Introduction

on

  • 3,797 views

 

Statistics

Views

Total Views
3,797
Views on SlideShare
3,797
Embed Views
0

Actions

Likes
0
Downloads
66
Comments
0

0 Embeds 0

No embeds

Accessibility

Categories

Upload Details

Uploaded via as Microsoft PowerPoint

Usage Rights

© All Rights Reserved

Report content

Flagged as inappropriate Flag as inappropriate
Flag as inappropriate

Select your reason for flagging this presentation as inappropriate.

Cancel
  • Full Name Full Name Comment goes here.
    Are you sure you want to
    Your message goes here
    Processing…
Post Comment
Edit your comment

    Java Unit Test and Coverage Introduction Java Unit Test and Coverage Introduction Presentation Transcript

    • Java Unit Test and Coverage IntroductionAlex Su2010/07/21 Copyright 2010 TCloud Computing Inc.
    • Agenda•Test-driven development•Junit •Ant Integration•Mock Object • Mockito•Code Coverage Analysis•Coverage Tool • Emma • Cobertura•Case Study Trend Micro Confidential
    • 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
    • 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
    • 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
    • Test-driven development Trend Micro Confidential
    • 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
    • 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
    • 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
    • Junit – Annotation• @BeforeClass• @AfterClass• @Before• @After• @Test• @Ignore Trend Micro Confidential
    • 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
    • JUnit@RunWith(Suite.class)@SuiteClasses({DummyTest1.class, DummyTest2.class})public class DummyTestSuite {} Trend Micro Confidential
    • 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
    • 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="**/*Test.java" /> </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
    • 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
    • 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
    • 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
    • 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
    • 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
    • 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
    • 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
    • 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
    • Code Coverage Analysis•Other Metrics •Function Coverage •Data Flow Coverage •Loop Coverage •Race Coverage •Relational Operator Coverage Trend Micro Confidential
    • Coverage Tool•Instrumentation • Source code instrumentation • Bytecode instrumentation • Runtime instrumentation Trend Micro Confidential
    • 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
    • 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
    • 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 - http://www.eclemma.org/•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
    • 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 - http://ecobertura.johoop.de/ Trend Micro Confidential
    • 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
    • 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
    • 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
    • Coverage Tool - Comparsion(Exception)• Clover__CLR3_0_217a17agbtkjkdv.R.inc(1571);__CLR3_0_217a17agbtkjkdv.R.inc(1572);String str = "abc";__CLR3_0_217a17agbtkjkdv.R.inc(1573);System.out.println(str.substring(5)); Trend Micro Confidential
    • 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)iterator.next(); Trend Micro Confidential
    • 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)iterator.next(); System.out.println(s); aflag[1] = true; } else { break; }} while(true);aflag[3] = true; Trend Micro Confidential
    • 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)iterator.next(); 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
    • Coverage Tool - Comparsion(Loop)• Clover__CLR3_0_2145145gbu63tpg.R.inc(1462);__CLR3_0_2145145gbu63tpg.R.inc(1463);List list = new ArrayList();__CLR3_0_2145145gbu63tpg.R.inc(1464);String element;for(Iterator iterator = list.iterator(); iterator.hasNext(); System.out.println(element)) { element = (String)iterator.next(); __CLR3_0_2145145gbu63tpg.R.inc(1465); } Trend Micro Confidential
    • Coverage Tool - Comparsion(Loop)• Clover with decompile result Iterator iterator; __CLR3_0_2166166gbu71moi.R.inc(1535); __CLR3_0_2166166gbu71moi.R.inc(1536); List list = new ArrayList(); __CLR3_0_2166166gbu71moi.R.inc(1537); __CLR3_0_2166166gbu71moi.R.inc(1538); 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: __CLR3_0_2166166gbu71moi.R.inc(1541); String element = (String)iterator.next(); System.out.println(element); if(true) goto _L4; else goto _L3_L3: Trend Micro Confidential
    • Case Study Trend Micro Confidential
    • THANK YOU! Trend Micro Confidential