SlideShare a Scribd company logo
Java Unit Test and Coverage Introduction
Alex Su
2010/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 development

Test-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 - Scenario

Given/When/Then

Example 1: New lists are empty
Given a new list
Then the list should be empty.

Example 2: Lists with things in them are not empty.
Given a new list
When we add an object
Then the list should not be empty.



                          Trend Micro Confidential
Test-driven development - Scenario
class 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
  haven't tested for and didn't expect, such as a
  NullPointerException or an
  ArrayIndexOutOfBoundsException.


                           Trend Micro Confidential
Junit – Annotation

• @BeforeClass
• @AfterClass
• @Before
• @After
• @Test
• @Ignore




                     Trend Micro Confidential
JUnit
public 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 - Mockito
public 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(new
IndexOutOfBoundsException());
    }

    @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 Coverage

boolean 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 code

Gathers method coverage      yes                            yes                   yes

Gathers statement coverage line only                        yes                   yes

Gathers branch coverage      indirectly                     yes                   yes
Can work without source      yes                            yes                   no
Requires separate build      no                             no                    yes

Requires specialised runtime yes                            not accurate          no

View coverage data inline
                             not accurate                   yes                   yes
with source


Source level directives to
                             no                             no                    yes
control coverage gathering

Runtime performace           high impact                    variable              variable
Container 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
• GPL'd 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 that's 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 Code
String str = "abc";
System.out.println(str.substring(5));


•Decompile Result
String str = "abc";
System.out.println(str.substring(5));




                                        Trend Micro Confidential
Coverage Tool - Comparsion(Exception)

• Emma
boolean 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)

• Cobertura
boolean 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 Code
List<String> list = new ArrayList<String>();
for(String element : list) {
  System.out.println(element);
}


• Decompile result
String element;
for(Iterator iterator = list.iterator(); iterator.hasNext(); System.out.println(element))
  element = (String)iterator.next();




                                         Trend Micro Confidential
Coverage Tool - Comparsion(Loop)

• Emma
boolean 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)

• Cobertura
boolean 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 isn't 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

More Related Content

PDF
Clean Unit Test Patterns
PDF
Unit Testing Fundamentals
PPTX
Unit Testing
PDF
Workshop unit test
PDF
Unit testing best practices
PPTX
Unit Testing Concepts and Best Practices
PDF
Unit Test + Functional Programming = Love
ODP
Embrace Unit Testing
Clean Unit Test Patterns
Unit Testing Fundamentals
Unit Testing
Workshop unit test
Unit testing best practices
Unit Testing Concepts and Best Practices
Unit Test + Functional Programming = Love
Embrace Unit Testing

What's hot (20)

PPT
Automated Unit Testing
PPTX
Benefit From Unit Testing In The Real World
PPTX
An Introduction to Unit Testing
PPT
Unit testing
PDF
Unit testing best practices with JUnit
PDF
Test driven development - JUnit basics and best practices
ODP
Testing In Java
PPTX
Roy Osherove on Unit Testing Good Practices and Horrible Mistakes
PDF
Unit testing with JUnit
PPTX
Unit Testing And Mocking
PDF
Unit testing with Junit
PPTX
Understanding Unit Testing
PPTX
.Net Unit Testing with Visual Studio 2010
PDF
Unit Testing
PDF
How and what to unit test
PPTX
Best practices unit testing
PPTX
Unit Tests And Automated Testing
PDF
Unit Testing Done Right
ODP
Beginners - Get Started With Unit Testing in .NET
PPTX
Unit tests & TDD
Automated Unit Testing
Benefit From Unit Testing In The Real World
An Introduction to Unit Testing
Unit testing
Unit testing best practices with JUnit
Test driven development - JUnit basics and best practices
Testing In Java
Roy Osherove on Unit Testing Good Practices and Horrible Mistakes
Unit testing with JUnit
Unit Testing And Mocking
Unit testing with Junit
Understanding Unit Testing
.Net Unit Testing with Visual Studio 2010
Unit Testing
How and what to unit test
Best practices unit testing
Unit Tests And Automated Testing
Unit Testing Done Right
Beginners - Get Started With Unit Testing in .NET
Unit tests & TDD
Ad

Viewers also liked (20)

PDF
What test coverage mean to us
PPTX
Structure testing
KEY
Test Coverage in Rails
PPTX
Effective test coverage Techniques
PPTX
Test Coverage: An Art and a Science
PDF
[231] the simplicity of cluster apps with circuit
PDF
[223] h base consistent secondary indexing
PDF
[232] 수퍼컴퓨팅과 데이터 어낼리틱스
PDF
[113] lessons from realm
PDF
[234] 산업 현장을 위한 증강 현실 기기 daqri helmet 개발기
PDF
[224] 번역 모델 기반_질의_교정_시스템
PDF
[131] packetbeat과 elasticsearch
PDF
[142] how riot works
PDF
[112] 실전 스위프트 프로그래밍
PDF
[252] 증분 처리 플랫폼 cana 개발기
PDF
[161] 데이터사이언스팀 빌딩
PDF
[263] s2graph large-scale-graph-database-with-hbase-2
PDF
[153] apache reef
PDF
[243] turning data into value
PDF
[133] 브라우저는 vsync를 어떻게 활용하고 있을까
What test coverage mean to us
Structure testing
Test Coverage in Rails
Effective test coverage Techniques
Test Coverage: An Art and a Science
[231] the simplicity of cluster apps with circuit
[223] h base consistent secondary indexing
[232] 수퍼컴퓨팅과 데이터 어낼리틱스
[113] lessons from realm
[234] 산업 현장을 위한 증강 현실 기기 daqri helmet 개발기
[224] 번역 모델 기반_질의_교정_시스템
[131] packetbeat과 elasticsearch
[142] how riot works
[112] 실전 스위프트 프로그래밍
[252] 증분 처리 플랫폼 cana 개발기
[161] 데이터사이언스팀 빌딩
[263] s2graph large-scale-graph-database-with-hbase-2
[153] apache reef
[243] turning data into value
[133] 브라우저는 vsync를 어떻게 활용하고 있을까
Ad

Similar to Java Unit Test and Coverage Introduction (20)

PPT
Code coverage
PDF
Полезные метрики покрытия. Практический опыт и немного теории
PPTX
Approval Tests at Agile 2012
PPT
A beginners guide to testing
PPT
Assessing Unit Test Quality
PDF
Code Coverage
PDF
Unit testingandcontinousintegrationfreenest1dot4
PPTX
Modeling and Testing Dovetail in MagicDraw
PDF
froglogic Coco Code Coverage Presentation
PPT
PDF
Bdd and-testing
PDF
Behaviour Driven Development and Thinking About Testing
 
PDF
OCCF: A Framework for Developing Test Coverage Measurement Tools Supporting M...
PPTX
JUnit Test Case With Processminer modules.pptx
PDF
Testing: Python, Java, Groovy, etc.
PPTX
Automating The Process For Building Reliable Software
ODP
Improve your development skills with Test Driven Development
PDF
ES3-2020-07 Testing techniques
PPTX
Software Testing_mmmmmmmmmmmmmmmmmmmmmmm
PPTX
Utility of Test Coverage Metrics in TDD
Code coverage
Полезные метрики покрытия. Практический опыт и немного теории
Approval Tests at Agile 2012
A beginners guide to testing
Assessing Unit Test Quality
Code Coverage
Unit testingandcontinousintegrationfreenest1dot4
Modeling and Testing Dovetail in MagicDraw
froglogic Coco Code Coverage Presentation
Bdd and-testing
Behaviour Driven Development and Thinking About Testing
 
OCCF: A Framework for Developing Test Coverage Measurement Tools Supporting M...
JUnit Test Case With Processminer modules.pptx
Testing: Python, Java, Groovy, etc.
Automating The Process For Building Reliable Software
Improve your development skills with Test Driven Development
ES3-2020-07 Testing techniques
Software Testing_mmmmmmmmmmmmmmmmmmmmmmm
Utility of Test Coverage Metrics in TDD

More from Alex Su (9)

PDF
Node js introduction
PPTX
One click deployment
PPTX
Scrum Introduction
PPTX
Redis Introduction
PPTX
Python decorators
PPTX
Using puppet
PPT
JMS Introduction
PPTX
Spring Framework Introduction
PPTX
Cascading introduction
Node js introduction
One click deployment
Scrum Introduction
Redis Introduction
Python decorators
Using puppet
JMS Introduction
Spring Framework Introduction
Cascading introduction

Recently uploaded (20)

PDF
Network Security Unit 5.pdf for BCA BBA.
PPTX
Detection-First SIEM: Rule Types, Dashboards, and Threat-Informed Strategy
PDF
Chapter 3 Spatial Domain Image Processing.pdf
PDF
Electronic commerce courselecture one. Pdf
PDF
Diabetes mellitus diagnosis method based random forest with bat algorithm
PDF
Blue Purple Modern Animated Computer Science Presentation.pdf.pdf
PDF
Architecting across the Boundaries of two Complex Domains - Healthcare & Tech...
PDF
Peak of Data & AI Encore- AI for Metadata and Smarter Workflows
DOCX
The AUB Centre for AI in Media Proposal.docx
PDF
Advanced methodologies resolving dimensionality complications for autism neur...
PPTX
Effective Security Operations Center (SOC) A Modern, Strategic, and Threat-In...
PDF
Encapsulation theory and applications.pdf
PPTX
Understanding_Digital_Forensics_Presentation.pptx
PPTX
A Presentation on Artificial Intelligence
PDF
CIFDAQ's Market Insight: SEC Turns Pro Crypto
PDF
Bridging biosciences and deep learning for revolutionary discoveries: a compr...
PDF
Mobile App Security Testing_ A Comprehensive Guide.pdf
PPTX
Big Data Technologies - Introduction.pptx
PDF
Approach and Philosophy of On baking technology
PPTX
20250228 LYD VKU AI Blended-Learning.pptx
Network Security Unit 5.pdf for BCA BBA.
Detection-First SIEM: Rule Types, Dashboards, and Threat-Informed Strategy
Chapter 3 Spatial Domain Image Processing.pdf
Electronic commerce courselecture one. Pdf
Diabetes mellitus diagnosis method based random forest with bat algorithm
Blue Purple Modern Animated Computer Science Presentation.pdf.pdf
Architecting across the Boundaries of two Complex Domains - Healthcare & Tech...
Peak of Data & AI Encore- AI for Metadata and Smarter Workflows
The AUB Centre for AI in Media Proposal.docx
Advanced methodologies resolving dimensionality complications for autism neur...
Effective Security Operations Center (SOC) A Modern, Strategic, and Threat-In...
Encapsulation theory and applications.pdf
Understanding_Digital_Forensics_Presentation.pptx
A Presentation on Artificial Intelligence
CIFDAQ's Market Insight: SEC Turns Pro Crypto
Bridging biosciences and deep learning for revolutionary discoveries: a compr...
Mobile App Security Testing_ A Comprehensive Guide.pdf
Big Data Technologies - Introduction.pptx
Approach and Philosophy of On baking technology
20250228 LYD VKU AI Blended-Learning.pptx

Java Unit Test and Coverage Introduction

  • 1. Java Unit Test and Coverage Introduction Alex Su 2010/07/21 Copyright 2010 TCloud Computing Inc.
  • 2. Agenda •Test-driven development •Junit •Ant Integration •Mock Object • Mockito •Code Coverage Analysis •Coverage Tool • Emma • Cobertura •Case Study Trend Micro Confidential
  • 3. Test-driven development Test-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. Test-driven development - Scenario Given/When/Then Example 1: New lists are empty Given a new list Then the list should be empty. Example 2: Lists with things in them are not empty. Given a new list When we add an object Then the list should not be empty. Trend Micro Confidential
  • 5. Test-driven development - Scenario class 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. Test-driven development Trend Micro Confidential
  • 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. 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. 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 haven't tested for and didn't expect, such as a NullPointerException or an ArrayIndexOutOfBoundsException. Trend Micro Confidential
  • 10. Junit – Annotation • @BeforeClass • @AfterClass • @Before • @After • @Test • @Ignore Trend Micro Confidential
  • 11. JUnit public 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
  • 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. 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
  • 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. 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. Mock Object - Mockito public 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(new IndexOutOfBoundsException()); } @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. 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. 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. Code Coverage Analysis •Statement Coverage(Line) •Basic Block Coverage •Decision Coverage(Branch) •Condition Coverage •Multiple Condition Coverage boolean a = true, b = true; if(a && b) { System.out.println("true"); } else { System.out.println("false"); } Trend Micro Confidential
  • 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. 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. Code Coverage Analysis •Other Metrics •Function Coverage •Data Flow Coverage •Loop Coverage •Race Coverage •Relational Operator Coverage Trend Micro Confidential
  • 24. Coverage Tool •Instrumentation • Source code instrumentation • Bytecode instrumentation • Runtime instrumentation Trend Micro Confidential
  • 25. Coverage Tool Possible feature Runtime Bytecode Source code Gathers method coverage yes yes yes Gathers statement coverage line only yes yes Gathers branch coverage indirectly yes yes Can work without source yes yes no Requires separate build no no yes Requires specialised runtime yes not accurate no View coverage data inline not accurate yes yes with source Source level directives to no no yes control coverage gathering Runtime performace high impact variable variable Container friendly no not accurate yes Trend Micro Confidential
  • 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. 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
  • 28. Coverage Tool - Cobertura • Last update : 2010-03-03 • GPL'd 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 that's 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
  • 29. Coverage Tool – Comparsion(Exception) • Source Code String str = "abc"; System.out.println(str.substring(5)); •Decompile Result String str = "abc"; System.out.println(str.substring(5)); Trend Micro Confidential
  • 30. Coverage Tool - Comparsion(Exception) • Emma boolean aflag[] = ($VRc != null ? $VRc : $VRi())[3]; String s = "abc"; System.out.println(s.substring(5)); aflag[0] = true; Trend Micro Confidential
  • 31. Coverage Tool - Comparsion(Exception) • Cobertura boolean 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. 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
  • 33. Coverage Tool – Comparsion(Loop) •Source Code List<String> list = new ArrayList<String>(); for(String element : list) { System.out.println(element); } • Decompile result String element; for(Iterator iterator = list.iterator(); iterator.hasNext(); System.out.println(element)) element = (String)iterator.next(); Trend Micro Confidential
  • 34. Coverage Tool - Comparsion(Loop) • Emma boolean 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
  • 35. Coverage Tool - Comparsion(Loop) • Cobertura boolean 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
  • 36. 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
  • 37. 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 isn't 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
  • 38. Case Study Trend Micro Confidential
  • 39. THANK YOU! Trend Micro Confidential