an introduction into junitjunit inspired various other unit testing frameworks for other programming...
TRANSCRIPT
![Page 1: An Introduction into JUnitJUnit inspired various other unit testing frameworks for other programming languages, like NUnit (.NET), CppUnit (C++) JUnit is the de facto standard for](https://reader034.vdocuments.mx/reader034/viewer/2022051811/601d696d0bf5025f2303fcde/html5/thumbnails/1.jpg)
CHAIR FOR SOFTWARE DESIGN AND QUALITY
X =1.00
X =0.01perf
lossSDSoftware Design and Quality
An Introduction into JUnitVorlesung Programmieren Wintersemester 2016/17Erik Burger | 8 February 2017
KIT – The Research University in the Helmholtz Association
www.kit.edu
![Page 2: An Introduction into JUnitJUnit inspired various other unit testing frameworks for other programming languages, like NUnit (.NET), CppUnit (C++) JUnit is the de facto standard for](https://reader034.vdocuments.mx/reader034/viewer/2022051811/601d696d0bf5025f2303fcde/html5/thumbnails/2.jpg)
Outline – Testing
1 Classification of Tests
2 Test-driven development1 Definition2 Refactoring
Classification of Tests Test-driven development
Erik Burger – An Introduction into JUnit 8 February 2017 2/46
![Page 3: An Introduction into JUnitJUnit inspired various other unit testing frameworks for other programming languages, like NUnit (.NET), CppUnit (C++) JUnit is the de facto standard for](https://reader034.vdocuments.mx/reader034/viewer/2022051811/601d696d0bf5025f2303fcde/html5/thumbnails/3.jpg)
Outline – JUnit
3 Overview
4 Assertions
5 Fixtures1 Definition2 Example3 Parameterised Tests4 Test Suites
6 Eclipse Integration1 Test Runners2 Screenshot
Classification of Tests Test-driven development
Erik Burger – An Introduction into JUnit 8 February 2017 3/46
![Page 4: An Introduction into JUnitJUnit inspired various other unit testing frameworks for other programming languages, like NUnit (.NET), CppUnit (C++) JUnit is the de facto standard for](https://reader034.vdocuments.mx/reader034/viewer/2022051811/601d696d0bf5025f2303fcde/html5/thumbnails/4.jpg)
Foreword
Program testing can be used to show the presence of bugs, butnever to show their absence!
Dijkstra 1972
Classification of Tests Test-driven development
Erik Burger – An Introduction into JUnit 8 February 2017 4/46
![Page 5: An Introduction into JUnitJUnit inspired various other unit testing frameworks for other programming languages, like NUnit (.NET), CppUnit (C++) JUnit is the de facto standard for](https://reader034.vdocuments.mx/reader034/viewer/2022051811/601d696d0bf5025f2303fcde/html5/thumbnails/5.jpg)
Classification of Tests
Functional TestsCorrectness according to specification
Concurrency/Thread safeness
Non-FunctionalPerformance
Security
Usability
Interoperability
Reliability
Classification of Tests Test-driven development
Erik Burger – An Introduction into JUnit 8 February 2017 5/46
![Page 6: An Introduction into JUnitJUnit inspired various other unit testing frameworks for other programming languages, like NUnit (.NET), CppUnit (C++) JUnit is the de facto standard for](https://reader034.vdocuments.mx/reader034/viewer/2022051811/601d696d0bf5025f2303fcde/html5/thumbnails/6.jpg)
Classification of Tests
Knowledgeblack-box tests
white-box tests
StructureUnit
Integration
System
Classification of Tests Test-driven development
Erik Burger – An Introduction into JUnit 8 February 2017 6/46
![Page 7: An Introduction into JUnitJUnit inspired various other unit testing frameworks for other programming languages, like NUnit (.NET), CppUnit (C++) JUnit is the de facto standard for](https://reader034.vdocuments.mx/reader034/viewer/2022051811/601d696d0bf5025f2303fcde/html5/thumbnails/7.jpg)
Test-Driven Development
“Test-infected development” (Erich Gamma)As a developer, you can’t stop coding until everything works
Extreme Testing
Testing is more important than coding
Testing First
Classification of Tests Test-driven development
Erik Burger – An Introduction into JUnit 8 February 2017 7/46
![Page 8: An Introduction into JUnitJUnit inspired various other unit testing frameworks for other programming languages, like NUnit (.NET), CppUnit (C++) JUnit is the de facto standard for](https://reader034.vdocuments.mx/reader034/viewer/2022051811/601d696d0bf5025f2303fcde/html5/thumbnails/8.jpg)
Test-Driven Development
JUnit: Failure JUnit: OK
1. add tests
2. fulfil tests
3. simplify/refactor code
Classification of Tests Test-driven development
Erik Burger – An Introduction into JUnit 8 February 2017 8/46
![Page 9: An Introduction into JUnitJUnit inspired various other unit testing frameworks for other programming languages, like NUnit (.NET), CppUnit (C++) JUnit is the de facto standard for](https://reader034.vdocuments.mx/reader034/viewer/2022051811/601d696d0bf5025f2303fcde/html5/thumbnails/9.jpg)
Isolated Testing
Object oriented classes often have dependencies on other classes
A lot of classes cannot be tested independently
→ micro integration tests
Starting from a certain degree of dependencies, test effort risesdisproportionately high
Classification of Tests Test-driven development
Erik Burger – An Introduction into JUnit 8 February 2017 9/46
![Page 10: An Introduction into JUnitJUnit inspired various other unit testing frameworks for other programming languages, like NUnit (.NET), CppUnit (C++) JUnit is the de facto standard for](https://reader034.vdocuments.mx/reader034/viewer/2022051811/601d696d0bf5025f2303fcde/html5/thumbnails/10.jpg)
Isolated Testing
Test represent typical usage scenarios
Less dependencies→ easier to useHigh degree of dependencies
Lack of modularisation?Bad design?Bad code dependency management
→ Refactoring
Classification of Tests Test-driven development
Erik Burger – An Introduction into JUnit 8 February 2017 10/46
![Page 11: An Introduction into JUnitJUnit inspired various other unit testing frameworks for other programming languages, like NUnit (.NET), CppUnit (C++) JUnit is the de facto standard for](https://reader034.vdocuments.mx/reader034/viewer/2022051811/601d696d0bf5025f2303fcde/html5/thumbnails/11.jpg)
Refactoring
Keep your code simple – always
Refactor codeBefore testing – fulfil test with simple code
After testing – make code more simple
Without changing semantics you canDivide or merge classes
Move methods and attribute to other classes
Rename classes, methods, parameters, and variables
Extract or integrate methods
Replace inheritance by delegation and vice versa
Introduce interfaces
Classification of Tests Test-driven development
Erik Burger – An Introduction into JUnit 8 February 2017 11/46
![Page 12: An Introduction into JUnitJUnit inspired various other unit testing frameworks for other programming languages, like NUnit (.NET), CppUnit (C++) JUnit is the de facto standard for](https://reader034.vdocuments.mx/reader034/viewer/2022051811/601d696d0bf5025f2303fcde/html5/thumbnails/12.jpg)
Challenges for Testing Large-ScaleSystems
Building test environments is time-consumingClass dependencies require instantiation of multiple objects that have to beconfigured
Tests slow down if system borders are crossedInteraction between database and middleware creates delays
Testing exceptional circumstances is non-trivialDifficult to reproduce system faults
→ Keep tests simple, fast and coherent
Classification of Tests Test-driven development
Erik Burger – An Introduction into JUnit 8 February 2017 12/46
![Page 13: An Introduction into JUnitJUnit inspired various other unit testing frameworks for other programming languages, like NUnit (.NET), CppUnit (C++) JUnit is the de facto standard for](https://reader034.vdocuments.mx/reader034/viewer/2022051811/601d696d0bf5025f2303fcde/html5/thumbnails/13.jpg)
Bad smells
See [Fowler 2004]
Duplicated logicCopies are difficult to handle
Usually each copy start its own life
Leads to spread information
Hard to manage changes
Big classes and long methodsHinder mobility, localisation, usage, and documentation
Medium for duplicated code
Classification of Tests Test-driven development
Erik Burger – An Introduction into JUnit 8 February 2017 13/46
![Page 14: An Introduction into JUnitJUnit inspired various other unit testing frameworks for other programming languages, like NUnit (.NET), CppUnit (C++) JUnit is the de facto standard for](https://reader034.vdocuments.mx/reader034/viewer/2022051811/601d696d0bf5025f2303fcde/html5/thumbnails/14.jpg)
Bad smells
Bad naming and non-fitting code-structuresIncrease effort for learning how the program works
Speculative generalisationElements of design formerly intended to make code flexible – but neverused
CommentsOften used as deodorant for bad smells
Needless after refactoringDo not mix up with comments used for
Design decisionsDocumentation of public interfaces (Javadoc)References
Classification of Tests Test-driven development
Erik Burger – An Introduction into JUnit 8 February 2017 14/46
![Page 15: An Introduction into JUnitJUnit inspired various other unit testing frameworks for other programming languages, like NUnit (.NET), CppUnit (C++) JUnit is the de facto standard for](https://reader034.vdocuments.mx/reader034/viewer/2022051811/601d696d0bf5025f2303fcde/html5/thumbnails/15.jpg)
JUnit
3 Overview
4 Assertions
5 Fixtures
6 Eclipse Integration
Overview Assertions Fixtures Eclipse Integration References
Erik Burger – An Introduction into JUnit 8 February 2017 15/46
![Page 16: An Introduction into JUnitJUnit inspired various other unit testing frameworks for other programming languages, like NUnit (.NET), CppUnit (C++) JUnit is the de facto standard for](https://reader034.vdocuments.mx/reader034/viewer/2022051811/601d696d0bf5025f2303fcde/html5/thumbnails/16.jpg)
JUnit – Overview
JUnit is a framework for writing testsJUnit uses Java’s reflection capabilities (Java programs can examinetheir own code)JUnit helps the programmer:
define and execute tests and test suitesformalize requirements and clarify architecturewrite and debug codeintegrate code and always be ready to release a working version
JUnit is not included in Sun’s SDK, but almost all IDEs include it (e.g.,Eclipse)
Overview Assertions Fixtures Eclipse Integration References
Erik Burger – An Introduction into JUnit 8 February 2017 16/46
![Page 17: An Introduction into JUnitJUnit inspired various other unit testing frameworks for other programming languages, like NUnit (.NET), CppUnit (C++) JUnit is the de facto standard for](https://reader034.vdocuments.mx/reader034/viewer/2022051811/601d696d0bf5025f2303fcde/html5/thumbnails/17.jpg)
JUnit
HistoryJUnit was written by Erich Gamma (of Design Patterns) and Kent Beck(creator of XP methodology)
JUnit inspired various other unit testing frameworks for otherprogramming languages, like NUnit (.NET), CppUnit (C++)
JUnit is the de facto standard for test driven Java development
[Gamma et al. 1994]
Overview Assertions Fixtures Eclipse Integration References
Erik Burger – An Introduction into JUnit 8 February 2017 17/46
![Page 18: An Introduction into JUnitJUnit inspired various other unit testing frameworks for other programming languages, like NUnit (.NET), CppUnit (C++) JUnit is the de facto standard for](https://reader034.vdocuments.mx/reader034/viewer/2022051811/601d696d0bf5025f2303fcde/html5/thumbnails/18.jpg)
JUnit 3 vs JUnit 4
JUnit4JUnit4 was a complete redevelopment
includes ideas from other frameworks and uses features of Java 1.5
uses Java annotations (such as @Test)
This lecture is based on JUnit 4
Junit 5 is under devlopment for Java 8
Be carefulMany (web) tutorials are still based on JUnit 3
JUnit 4 is backwards compatible to version 3
JUnit 4 is much cleaner
Overview Assertions Fixtures Eclipse Integration References
Erik Burger – An Introduction into JUnit 8 February 2017 18/46
![Page 19: An Introduction into JUnitJUnit inspired various other unit testing frameworks for other programming languages, like NUnit (.NET), CppUnit (C++) JUnit is the de facto standard for](https://reader034.vdocuments.mx/reader034/viewer/2022051811/601d696d0bf5025f2303fcde/html5/thumbnails/19.jpg)
Terminology
A test fixture sets up the data (both objects and primitives) that areneeded to run tests
Example: If you are testing code that updates an employee record, youneed an employee record to test it on
A unit test is a test of a single class
A test case tests the response of a single method to a particular set ofinputs
A test suite is a collection of test cases
A test runner is software that runs tests and reports resultsAn integration test is a test of how well classes work together
JUnit provides some limited support for integration tests
Overview Assertions Fixtures Eclipse Integration References
Erik Burger – An Introduction into JUnit 8 February 2017 19/46
![Page 20: An Introduction into JUnitJUnit inspired various other unit testing frameworks for other programming languages, like NUnit (.NET), CppUnit (C++) JUnit is the de facto standard for](https://reader034.vdocuments.mx/reader034/viewer/2022051811/601d696d0bf5025f2303fcde/html5/thumbnails/20.jpg)
Structure
test fixture
test runner
test suite
another test case
test case (for one method)
unit test (for one class)
another test case
another test case
another test case
another unit test
another test case
test case (for one method)
unit test (for one class)
A unit test tests the methods in a singleclass
A test case tests (insofar as possible) asingle method
You can have multiple test cases for asingle method
A test suite combines unit tests
The test fixture provides softwaresupport for all this
The test runner runs unit tests or anentire test suite
Integration testing is not well supportedby JUnit
Overview Assertions Fixtures Eclipse Integration References
Erik Burger – An Introduction into JUnit 8 February 2017 20/46
![Page 21: An Introduction into JUnitJUnit inspired various other unit testing frameworks for other programming languages, like NUnit (.NET), CppUnit (C++) JUnit is the de facto standard for](https://reader034.vdocuments.mx/reader034/viewer/2022051811/601d696d0bf5025f2303fcde/html5/thumbnails/21.jpg)
Test Case Verdicts
A verdict is the declared result of executing a single test.
Pass: the test case achieved its intended purpose, and the softwareunder test performed as expected.
Fail: the test case achieved its intended purpose, but the softwareunder test did not perform as expected.
Error: the test case did not achieve its intended purpose.Potential reasons:
An unexpected event occurred during the test case.The test case could not be set up properly
Overview Assertions Fixtures Eclipse Integration References
Erik Burger – An Introduction into JUnit 8 February 2017 21/46
![Page 22: An Introduction into JUnitJUnit inspired various other unit testing frameworks for other programming languages, like NUnit (.NET), CppUnit (C++) JUnit is the de facto standard for](https://reader034.vdocuments.mx/reader034/viewer/2022051811/601d696d0bf5025f2303fcde/html5/thumbnails/22.jpg)
What is a JUnit Test?
A test “script” is just a collection of Java methods.General idea is to create a few Java objects, do something interesting withthem, and then determine if the objects have the correct properties.
What is added? Assertions.A package of methods that checks for various properties:
“equality” of objectsidentical object referencesnull / non-null object references
The assertions are used to determine the test case verdict.
Overview Assertions Fixtures Eclipse Integration References
Erik Burger – An Introduction into JUnit 8 February 2017 22/46
![Page 23: An Introduction into JUnitJUnit inspired various other unit testing frameworks for other programming languages, like NUnit (.NET), CppUnit (C++) JUnit is the de facto standard for](https://reader034.vdocuments.mx/reader034/viewer/2022051811/601d696d0bf5025f2303fcde/html5/thumbnails/23.jpg)
Organisation of JUnit Tests
Each method represents a single test case that can independentlyhave a verdict (Pass, Fail, Error).
Normally, all the tests for one Java class are grouped together into aseparate class.Naming convention:
Class to be tested: ValueClass containing tests: ValueTest
Overview Assertions Fixtures Eclipse Integration References
Erik Burger – An Introduction into JUnit 8 February 2017 23/46
![Page 24: An Introduction into JUnitJUnit inspired various other unit testing frameworks for other programming languages, like NUnit (.NET), CppUnit (C++) JUnit is the de facto standard for](https://reader034.vdocuments.mx/reader034/viewer/2022051811/601d696d0bf5025f2303fcde/html5/thumbnails/24.jpg)
Writing a JUnit test class
Start by importing these JUnit 4 classes
import org.junit.*import static org.junit.Assert.*; // note static import
Declare your test class in the usual way
public class MyProgramTest {
}
Declare an instance of the class being tested
public class MyProgramTest {
MyProgram program;
int someVariable;
}
Overview Assertions Fixtures Eclipse Integration References
Erik Burger – An Introduction into JUnit 8 February 2017 24/46
![Page 25: An Introduction into JUnitJUnit inspired various other unit testing frameworks for other programming languages, like NUnit (.NET), CppUnit (C++) JUnit is the de facto standard for](https://reader034.vdocuments.mx/reader034/viewer/2022051811/601d696d0bf5025f2303fcde/html5/thumbnails/25.jpg)
A simple example
import org.junit.*;
import static org.junit.Assert.*;
public class ArithmeticTest {
@Test
public void testMultiply() {
assertEquals(4, Arithmetic.multiply(2, 2));
assertEquals(-15, Arithmetic.multiply(3, -5));
}
@Test
public void testIsPositive() {
assertTrue(Arithmetic.isPositive(5));
assertFalse(Arithmetic.isPositive(-5));
assertFalse(Arithmetic.isPositive(0));
}
}
Overview Assertions Fixtures Eclipse Integration References
Erik Burger – An Introduction into JUnit 8 February 2017 25/46
![Page 26: An Introduction into JUnitJUnit inspired various other unit testing frameworks for other programming languages, like NUnit (.NET), CppUnit (C++) JUnit is the de facto standard for](https://reader034.vdocuments.mx/reader034/viewer/2022051811/601d696d0bf5025f2303fcde/html5/thumbnails/26.jpg)
Assertions
Assertions are defined in the JUnit class AssertIf an assertion is true, the method continues executing.
If any assertion is false, the method stops executing at that point, andthe result for the test case will be fail.
If any other exception is thrown during the method, the result for thetest case will be error.
If no assertions were violated for the entire method, the test case willpass.
All assertion methods are static methods.
Overview Assertions Fixtures Eclipse Integration References
Erik Burger – An Introduction into JUnit 8 February 2017 26/46
![Page 27: An Introduction into JUnitJUnit inspired various other unit testing frameworks for other programming languages, like NUnit (.NET), CppUnit (C++) JUnit is the de facto standard for](https://reader034.vdocuments.mx/reader034/viewer/2022051811/601d696d0bf5025f2303fcde/html5/thumbnails/27.jpg)
Assertion Methods
Boolean conditions are true or falseassertTrue(condition)
assertFalse(condition)
Objects are null or non-nullassertNull(object)
assertNotNull(object)
Objects are identical or not identicali.e. two references to the same object assertSame(expected, actual)
assertNotSame(expected, actual)
Overview Assertions Fixtures Eclipse Integration References
Erik Burger – An Introduction into JUnit 8 February 2017 27/46
![Page 28: An Introduction into JUnitJUnit inspired various other unit testing frameworks for other programming languages, like NUnit (.NET), CppUnit (C++) JUnit is the de facto standard for](https://reader034.vdocuments.mx/reader034/viewer/2022051811/601d696d0bf5025f2303fcde/html5/thumbnails/28.jpg)
Assertion Methods
“Equality” of objectsassertEquals(expected, actual)
valid if: expected.equals(actual)
“Equality” of arraysassertArrayEquals(expected, actual)
arrays must have same length
for each valid value for i, check as appropriate:
assertEquals(expected[i],actual[i])
assertArrayEquals(expected[i],actual[i])
There is also an unconditional failure assertion fail() that always results ina fail verdict.
Overview Assertions Fixtures Eclipse Integration References
Erik Burger – An Introduction into JUnit 8 February 2017 28/46
![Page 29: An Introduction into JUnitJUnit inspired various other unit testing frameworks for other programming languages, like NUnit (.NET), CppUnit (C++) JUnit is the de facto standard for](https://reader034.vdocuments.mx/reader034/viewer/2022051811/601d696d0bf5025f2303fcde/html5/thumbnails/29.jpg)
Test Fixture
Test FixtureA test fixture is the context in which a test case runs.Typically, test fixtures include:
Objects or resources that are available for use by any test case.Activities required to make these objects available and/or resourceallocation and de-allocation: “setup” and “teardown”.
Allows multiple tests of the same or similar objects
Share fixture code for multiple tests
Overview Assertions Fixtures Eclipse Integration References
Erik Burger – An Introduction into JUnit 8 February 2017 29/46
![Page 30: An Introduction into JUnitJUnit inspired various other unit testing frameworks for other programming languages, like NUnit (.NET), CppUnit (C++) JUnit is the de facto standard for](https://reader034.vdocuments.mx/reader034/viewer/2022051811/601d696d0bf5025f2303fcde/html5/thumbnails/30.jpg)
Before/After
@Before: Methods annotated with @Before are executed before everytest.
@After: Methods annotated with @After are executed after every test.
If there are e.g. 10 test, every @Before method is executed 10 times
More than one @Before or @After is allowed
Names of these methods are irrelevant, but must be public void
Overview Assertions Fixtures Eclipse Integration References
Erik Burger – An Introduction into JUnit 8 February 2017 30/46
![Page 31: An Introduction into JUnitJUnit inspired various other unit testing frameworks for other programming languages, like NUnit (.NET), CppUnit (C++) JUnit is the de facto standard for](https://reader034.vdocuments.mx/reader034/viewer/2022051811/601d696d0bf5025f2303fcde/html5/thumbnails/31.jpg)
Fixture – Example
public class MoneyTest {
private Money f12CHF;
private Money f14CHF;
private Money f28USD;
@Before
public void setUp() {
f12CHF= new Money(12, "CHF");
f14CHF= new Money(14, "CHF");
f28USD= new Money(28, "USD");
}
}
Overview Assertions Fixtures Eclipse Integration References
Erik Burger – An Introduction into JUnit 8 February 2017 31/46
![Page 32: An Introduction into JUnitJUnit inspired various other unit testing frameworks for other programming languages, like NUnit (.NET), CppUnit (C++) JUnit is the de facto standard for](https://reader034.vdocuments.mx/reader034/viewer/2022051811/601d696d0bf5025f2303fcde/html5/thumbnails/32.jpg)
Setup and Teardown
SetupUse the @Before annotation on a method containing code to run before eachtest case.
Teardown (regardless of the verdict)Use the @After annotation on a method containing code to run after eachtest case. These methods will run even if exceptions are thrown in the testcase or an assertion fails.
It is allowed to have any number of these annotationsAll methods annotated with @Before will be run before each test case, butthey may be run in any order.
Overview Assertions Fixtures Eclipse Integration References
Erik Burger – An Introduction into JUnit 8 February 2017 32/46
![Page 33: An Introduction into JUnitJUnit inspired various other unit testing frameworks for other programming languages, like NUnit (.NET), CppUnit (C++) JUnit is the de facto standard for](https://reader034.vdocuments.mx/reader034/viewer/2022051811/601d696d0bf5025f2303fcde/html5/thumbnails/33.jpg)
BeforeClass/AfterClass
@BeforeClass: executed once before a test suite
@AfterClass: executed once after a test suite
Only one @BeforeClass and @AfterClass allowed
Methods must be static
Overview Assertions Fixtures Eclipse Integration References
Erik Burger – An Introduction into JUnit 8 February 2017 33/46
![Page 34: An Introduction into JUnitJUnit inspired various other unit testing frameworks for other programming languages, like NUnit (.NET), CppUnit (C++) JUnit is the de facto standard for](https://reader034.vdocuments.mx/reader034/viewer/2022051811/601d696d0bf5025f2303fcde/html5/thumbnails/34.jpg)
Fixture – Example
public class MoneyTest {
private static string currency;
@BeforeClass
public static void setGlobalCurrency() {
this.currency = "CHF";
}
@Before
public void setUp() {
m12= new Money(12, this.currency);
m14= new Money(14, this.currency);
}
}
Overview Assertions Fixtures Eclipse Integration References
Erik Burger – An Introduction into JUnit 8 February 2017 34/46
![Page 35: An Introduction into JUnitJUnit inspired various other unit testing frameworks for other programming languages, like NUnit (.NET), CppUnit (C++) JUnit is the de facto standard for](https://reader034.vdocuments.mx/reader034/viewer/2022051811/601d696d0bf5025f2303fcde/html5/thumbnails/35.jpg)
Expected Exception
Exceptions that are expected on test executing
Annotation using @Test
@Test(expected=MyException.class)
If no exception is thrown, or an unexpected exception occurs, the testwill fail.
That is, reaching the end of the method with no exception will cause atest case failure.
Overview Assertions Fixtures Eclipse Integration References
Erik Burger – An Introduction into JUnit 8 February 2017 35/46
![Page 36: An Introduction into JUnitJUnit inspired various other unit testing frameworks for other programming languages, like NUnit (.NET), CppUnit (C++) JUnit is the de facto standard for](https://reader034.vdocuments.mx/reader034/viewer/2022051811/601d696d0bf5025f2303fcde/html5/thumbnails/36.jpg)
Expected Exceptions – example
new ArrayList<Object>().get(0);
Should throw an IndexOutOfBoundsException
@Test(expected = IndexOutOfBoundsException.class)
public void empty() {
new ArrayList<Object>().get(0);
}
Overview Assertions Fixtures Eclipse Integration References
Erik Burger – An Introduction into JUnit 8 February 2017 36/46
![Page 37: An Introduction into JUnitJUnit inspired various other unit testing frameworks for other programming languages, like NUnit (.NET), CppUnit (C++) JUnit is the de facto standard for](https://reader034.vdocuments.mx/reader034/viewer/2022051811/601d696d0bf5025f2303fcde/html5/thumbnails/37.jpg)
Ignore/Timeout
IgnoreTests annotated using @Ignore are not executed
Test runner reports that test was not run
@Ignore("Reason") allows to specify a reason why a test was not run
TimeoutTest allows to specify a timeout parameter
@Test(timeout=10) fails if the test takes more than 10 milliseconds
Overview Assertions Fixtures Eclipse Integration References
Erik Burger – An Introduction into JUnit 8 February 2017 37/46
![Page 38: An Introduction into JUnitJUnit inspired various other unit testing frameworks for other programming languages, like NUnit (.NET), CppUnit (C++) JUnit is the de facto standard for](https://reader034.vdocuments.mx/reader034/viewer/2022051811/601d696d0bf5025f2303fcde/html5/thumbnails/38.jpg)
Parameterised Tests
MotivationIf you want a test to run with several parameter values, you’d have to
loop over a collection of values
which means if there was a failure, the loop wouldn’t terminate
write unique test cases for each test data combination
which could prove to be a lot of coding
Support in JUnitWith JUnit, you can create highly flexible testing scenarios easily
Overview Assertions Fixtures Eclipse Integration References
Erik Burger – An Introduction into JUnit 8 February 2017 38/46
![Page 39: An Introduction into JUnitJUnit inspired various other unit testing frameworks for other programming languages, like NUnit (.NET), CppUnit (C++) JUnit is the de facto standard for](https://reader034.vdocuments.mx/reader034/viewer/2022051811/601d696d0bf5025f2303fcde/html5/thumbnails/39.jpg)
Parameterised Tests
Creating a parameterised test1 Create a generic test and decorate it with the @Test annotation2 Create a static feeder method that returns a Collection type and
decorate it with the @Parameters annotation3 Create class members for the parameter types required in the generic
method defined in Step 14 Create a constructor that takes these parameter types and
correspondingly links them to the class members defined in Step 35 Specify the test case be run with the Parameterized class via the
@RunWith annotation
Overview Assertions Fixtures Eclipse Integration References
Erik Burger – An Introduction into JUnit 8 February 2017 39/46
![Page 40: An Introduction into JUnitJUnit inspired various other unit testing frameworks for other programming languages, like NUnit (.NET), CppUnit (C++) JUnit is the de facto standard for](https://reader034.vdocuments.mx/reader034/viewer/2022051811/601d696d0bf5025f2303fcde/html5/thumbnails/40.jpg)
Parameterised Test – Example@RunWith(Parameterized.class)
public class ParameterizedTest {
private int numberToTest;
private int rest;
public ParameterizedTest(Integer pValue, Integer rValue) {
numberToTest = pValue.intValue();
rest = rValue.intValue();
}
@Parameters
public static List<Integer[]> testValues() {
return Arrays.asList(new Integer[][] {
{1,1}, {3,1}, {6,0}, {7,1}, {9,1}
});
}
@Test
public void isOdd() {
assertTrue(numberToTest % 2 == rest);
}
}
Overview Assertions Fixtures Eclipse Integration References
Erik Burger – An Introduction into JUnit 8 February 2017 40/46
![Page 41: An Introduction into JUnitJUnit inspired various other unit testing frameworks for other programming languages, like NUnit (.NET), CppUnit (C++) JUnit is the de facto standard for](https://reader034.vdocuments.mx/reader034/viewer/2022051811/601d696d0bf5025f2303fcde/html5/thumbnails/41.jpg)
Test Suites
Creating a test suiteTests can be combined to test suites
suites can contain other suites
useful for partitioning your test scenarios
well supported by Test Runners (see example)
Overview Assertions Fixtures Eclipse Integration References
Erik Burger – An Introduction into JUnit 8 February 2017 41/46
![Page 42: An Introduction into JUnitJUnit inspired various other unit testing frameworks for other programming languages, like NUnit (.NET), CppUnit (C++) JUnit is the de facto standard for](https://reader034.vdocuments.mx/reader034/viewer/2022051811/601d696d0bf5025f2303fcde/html5/thumbnails/42.jpg)
Test Suite – Example
import org.junit.runner.RunWith;
import org.junit.runners.Suite;
@RunWith(Suite.class)
@Suite.SuiteClasses({
MyTest1.class,
MyTest2.class,
MyTest3.class
}
)
public class AllTests {
}
Overview Assertions Fixtures Eclipse Integration References
Erik Burger – An Introduction into JUnit 8 February 2017 42/46
![Page 43: An Introduction into JUnitJUnit inspired various other unit testing frameworks for other programming languages, like NUnit (.NET), CppUnit (C++) JUnit is the de facto standard for](https://reader034.vdocuments.mx/reader034/viewer/2022051811/601d696d0bf5025f2303fcde/html5/thumbnails/43.jpg)
Running JUnit Tests
The JUnit framework does not provide a graphical test runner. Instead,it provides an API that can be used by IDEs to run test cases and atextual runner than can be used from a command line.
Eclipse and Netbeans each provide a graphical test runner that isintegrated into their respective environments.
Overview Assertions Fixtures Eclipse Integration References
Erik Burger – An Introduction into JUnit 8 February 2017 43/46
![Page 44: An Introduction into JUnitJUnit inspired various other unit testing frameworks for other programming languages, like NUnit (.NET), CppUnit (C++) JUnit is the de facto standard for](https://reader034.vdocuments.mx/reader034/viewer/2022051811/601d696d0bf5025f2303fcde/html5/thumbnails/44.jpg)
Test Runners
With the runner provided by JUnit:When a class is selected for execution, all the test case methods in theclass will be run.
The order in which the methods in the class are called (i.e. the order oftest case execution) is not predictable.
Other RunnersTest runners provided by IDEs may allow the user to select particularmethods, or to set the order of execution.
It is good practice to write tests with are independent of executionorder, and that are without dependencies on the state any previoustest(s).
Overview Assertions Fixtures Eclipse Integration References
Erik Burger – An Introduction into JUnit 8 February 2017 44/46
![Page 45: An Introduction into JUnitJUnit inspired various other unit testing frameworks for other programming languages, like NUnit (.NET), CppUnit (C++) JUnit is the de facto standard for](https://reader034.vdocuments.mx/reader034/viewer/2022051811/601d696d0bf5025f2303fcde/html5/thumbnails/45.jpg)
Eclipse TestRunner
EclipseJUnit included
GUI provided
easy re-running of tests
test history
Overview Assertions Fixtures Eclipse Integration References
Erik Burger – An Introduction into JUnit 8 February 2017 45/46
![Page 46: An Introduction into JUnitJUnit inspired various other unit testing frameworks for other programming languages, like NUnit (.NET), CppUnit (C++) JUnit is the de facto standard for](https://reader034.vdocuments.mx/reader034/viewer/2022051811/601d696d0bf5025f2303fcde/html5/thumbnails/46.jpg)
References
E.W. Dijkstra. “Notes on Structured Programming”. In: Structuredprogramming. Ed. by O. J. Dahl, E. W. Dijkstra, and C. A. R. Hoare.London, UK: Academic Press Ltd., 1972. ISBN: 0-12-200550-3.
Martin Fowler. Refactoring : improving the design of existing code.13. print. Addison-Wesley object technology series. Boston:Addison-Wesley, 2004. ISBN: 0-201-48567-2.
E. Gamma et al. Design Patterns: Elements of ReusableObject-Oriented Software (Adobe Reader). Pearson Education, 1994.ISBN: 9780321700698.
Frank Westphal. Testgetriebene Entwicklung – mit JUnit & FIT : wieSoftware änderbar bleibt. 1. Heidelberg: dpunkt-Verlag, 2006. ISBN:3-89864-220-8.
Overview Assertions Fixtures Eclipse Integration References
Erik Burger – An Introduction into JUnit 8 February 2017 46/46