Unit Testing /JUnit

advertisement
Lesson 7
Unit Testing /JUnit/
AUBG ICoSCIS Team
Assoc. Prof. Stoyan Bonev
March, 23 - 24, 2013
SWU, Blagoevgrad
Lesson Contents:
 Unit Testing
 Introduction to JUnit
 JUnit within/under NetBeans
3
Unit Testing
4
Acceptance testing
User needs
Requirement
specification
System testing
Design
Integration testing
Code
Unit testing
Categories of Testing
5
Unit Testing
 Different modules tested separately
 Focus: to detect defects injected during
coding
 UT is closely associated with coding
 Frequently the developer himself does UT
 SDM coding phase sometimes called “coding
and unit testing” phase
Testing
6
What is Unit Testing?
 A Unit Test is a procedure to validate a single
Functionality of an application.
One Functionality  One Unit Test
 Unit Tests are automated and self-checked.
 They run in isolation of each other.
 They do NOT depend on or connect to
external resources, like DB, Network etc.
 They can run in any order and even parallel to
each other.
7
Impetus Confidential
JUnit
– An Introduction -
8
JUnit – An introduction
 JUnit is a unit testing framework for Java.
 It comes from the family of unit testing
frameworks, collectively called xUnit, where
‘x’ stands for the programming language, e.g.
NUnit for C#, CPPUnit, JSUnit, PHPUnit,
PyUnit, RUnit etc.
Kent Beck & Erich Gamma originally wrote
this framework for ‘smalltalk’, called SUnit.
9
Impetus Confidential
Why choose JUnit?
 JUnit is simple and elegant.
 JUnit checks its own results and provide
immediate customized feedback.
 JUnit is hierarchial.
 JUnit has the widest IDE support, Eclipse,
NetBeans, BlueJ, ….
 JUnit is recognized by popular build tools like,
ant, maven etc.
 And… it’s free. 
10
Impetus Confidential
Design of JUnit

junit.framework.TestCase is the abstract command
class which you subclass into your Test Classes.

junit.framework.TestSuite is a composite of other
tests, either TestCase or TestSuite. This behavior
helps you create hierarchal tests with depth control.
11
Impetus Confidential
Design of JUnit
Image Courtesy: JUnit: A Cook’s Tour
12
Impetus Confidential
Write a test case
 Define a subclass XXXTest of junit.framework.TestCase
public class CalculatorTest extends TestCase {
…
}
 Define one or more testXXX() methods that can perform
the tests and assert expected results.
public void testAddition(){
Calculator calc = new Calculator();
int expected = 25;
int result = calc.add(10, 15);
assertEquals(result, expected); // asserting
}
13
Impetus Confidential
Write a test case
 Each test method has to be structured like this:
public void testAddition(){
// declarations
Calculator calc = new Calculator();
// preparing input /expected/ data
int expected = 25;
// computing result /real, actual/ data
int result = calc.add(10, 15);
// comparing result data to expected data
assertEquals(result, expected); // asserting
}
Impetus Confidential
14
Write a test case
 Override setUp() method to perform initialization.
@Override
protected void setUp() {
// Initialize anything, like
calc = new Calculator();
}
 Override tearDown() method to clean up.
@Override
protected void tearDown() {
// Clean up, like
calc = null; // gc, no need of delete operator
}
15
Impetus Confidential
Asserting expectations
 assertEquals (expected, actual)
 assertEquals (message, expected, actual)
 assertEquals (expected, actual, delta)
 assertEquals (message, expected, actual, delta)
 assertFalse ((message)condition)
 Assert(Not)Null (object)
 Assert(Not)Null (message, object)
 Assert(Not)Same (expected, actual)
 Assert(Not)Same (message, expected, actual)
 assertTrue ((message), condition)
Impetus Confidential
16
Failure?
 JUnit uses the term failure for
a test that fails expectedly.
That is
 An assertion was not valid or
 A fail() was encountered.
17
Impetus Confidential
Write a test case
public class CalculatorTest extends TestCase {
// initialize
protected void setUp()...
S
public void testAddition()...
public void testSubtraction()...
public void testMultiplication()...
T1
T2
T3
// clean up
protected void tearDownUp()...
D
}
Execution will be S
Impetus Confidential
,
,
T1 D S T2 D S T3 D
in any order.
18
Write a test suite
Write a class with a static method suite() that
creates a junit.framework.TestSuite containing
all the Tests.
public class AllTests {
public static Test suite() {
TestSuite suite = new TestSuite();
suite.addTestSuite(<test-1>.class);
suite.addTestSuite(<test-2>.class);
return suite;
}
}
19
Impetus Confidential
Run your tests
 You can either run TestCase or TestSuite
instances.
 A TestSuite will automatically run all its
registered TestCase instances.
 All public testXXX() methods of a TestCase will
be executed.
But there is no guarantee of the order.
20
Impetus Confidential
Run your tests
 JUnit comes with TestRunners that run your tests
and immediately provide you with feedbacks, errors,
and status of completion.
 JUnit has Textual and Graphical test runners.
 Textual Runner
>> java junit.textui.TestRunner AllTests
or,
junit.textui.TestRunner.run(AllTests.class);
 Graphical Runner
>> java junit.swingui.TestRunner AllTests
or,
junit.swingui.TestRunner.run(AllTests.class);
 IDE like Eclipse, NetBeans “Run as JUnit”
Impetus Confidential
21
Mocks
 Mocking is a way to deal with third-party
dependencies inside TestCase.
 Mocks create FAKE objects to mock a contract
behavior.
 Mocks help make tests more unitary.
22
Impetus Confidential
How to approach?
 Test a little, Code a little, Test a little, Code
a little … doesn’t it rhyme? ;)
 Write tests to validate functionality, not
functions.
 If tempted to write System.out.println() to
debug something, better write a test for it.
 If a bug is found, write a test to expose the
bug.
23
Impetus Confidential
JUnit
– within/under
NetBeans -
.
24
Impetus Confidential
JUnit within/under NetBeans
Practical Manual:
 Practical conventions
 How to build unit tests?
 How to run unit tests?
 Demo task
 Practical exercise task
25
Practical conventions
 Each production code class X has a test code
class Xtest derived from TestCase class
 Each method y(){…} from class X has a
method testy(){…} from Xtest class
 Each test code class Xtest has setUp()
method and tearDown() method
26
Practical conventions
 All production code located in a separate
project folder Source Packages
 All test code located in another separate
project folder Test Packages
 The skeletal structure and mostly the contents
of a test code class Xtest and test code
methods generated automatically
27
How to build unit tests?
Part 1
Create New project
Add Java class with main() method
Add user defined class to be tested


as part of file with Java main() class or
as a separate file within the same package.
Build the project and run it as a regular Java
application
Run > Run Main project (F6)
28
How to run unit tests?
Part 2a
Select Java class to be tested (from Projects…)
Click the right mouse button and invoke
Tools > Create Tests
Modify the generated text if necessary
Re-Build the project and run it as a JUnit test
Run > Test Project(…)
(Alt+F6)
Analyze the test results
29
How to run unit tests?
OR
(follow option 2b)
30
How to run unit tests?
Part 2b
Add a new File to the project
File > new File…
Select category: Unit Test
Select File Type: Test for Existing Class
You have to specify the class to be tested
You have to select JUnit version: 3
The test class automatically generated
Modify the generated text if necessary
Re-Build the project and run it as a JUnit test
Run > Test Project(…)
(Alt+F6)
Analyze the test results
31
Demo Task
 NetBeans project: SBJUnitTestClassLibrary
32
Demo Task
 NetBeans project: SBJUnitDistance01
33
Practical Exercise Task
 Expand project SBJUnitTestClassLibrary





Develop a class Power to implement arithmetic
power operator with double base and integer
exponent in two versions – iterative and recursive
Iterative method: double powi(double base, int n){ }
Recursive method: double powr(double base, int n){ }
Run the powx methods regular way
Run the powx methods using Junit
• Create PowerTest class
• Create testpowi() method and testpowr() method
• Run JUnit
34
Practical Exercise Task
 Expand project SBJUnitDistance01



Develop a class Counter to implement a counter as a
general purpose programming component with a
count data item and methods void incCount() and
method void decCount()
Run the Counter class regular way
Run the Counter class methods using Junit
• Create CounterTest class
• Create testincCount() method and testdecCount() method
• Run JUnit
35
Questions? And/Or
Thank You
For
Your Attention!
36
Download