360 likes | 509 Views
Lesson 7 Unit Testing /JUnit/ AUBG ICoSCIS Team Assoc. Prof. Stoyan Bonev. 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
E N D
Lesson 7Unit Testing /JUnit/AUBG ICoSCIS TeamAssoc. Prof. Stoyan Bonev
Lesson 7Unit Testing /JUnit/AUBG ICoSCIS TeamAssoc. Prof. Stoyan Bonev March, 23 - 24, 2013 SWU, Blagoevgrad
Lesson Contents: • Unit Testing • Introduction to JUnit • JUnit within/under NetBeans
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 • 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. 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. 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 TestCaseor TestSuite. This behavior helps you create hierarchal tests with depth control. Impetus Confidential
Design of JUnit • Image Courtesy: JUnit: A Cook’s Tour 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 } Impetus Confidential
Write a test case 14 • 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
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 } 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
Failure? • JUnit uses the term failure for a test that fails expectedly.That is • An assertion was not valid or • A fail() was encountered. Impetus Confidential
Write a test case public class CalculatorTest extends TestCase { // initialize protected void setUp()... Spublic void testAddition()... T1 public void testSubtraction()... T2 public void testMultiplication()... T3 // clean up protected void tearDownUp()... D } Execution will be S T1 D, S T2 D, S T3 Din any order. Impetus Confidential
Write a test suite Write a class with a static method suite() that creates a junit.framework.TestSuitecontaining 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; } } 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. 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.TestRunnerAllTests or, junit.textui.TestRunner.run(AllTests.class); • Graphical Runner >> java junit.swingui.TestRunnerAllTests or, junit.swingui.TestRunner.run(AllTests.class); • IDE like Eclipse, NetBeans “Run as JUnit” Impetus Confidential
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. 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. 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
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
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
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)
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
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
Demo Task • NetBeans project: SBJUnitDistance01
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
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
Questions? And/Or Thank You For Your Attention!