programmieren ii - unit testing & test-driven development · 2014-07-03 · outline 1 recap 2...
TRANSCRIPT
![Page 1: Programmieren II - Unit Testing & Test-Driven Development · 2014-07-03 · Outline 1 Recap 2 Testing-Introduction GeneralTesting ComponentTests 3 Testinginmoredetail Equivalenceclasses](https://reader034.vdocuments.us/reader034/viewer/2022042116/5e93d667ecc62629a240e1e4/html5/thumbnails/1.jpg)
Programmieren IIUnit Testing & Test-Driven Development
Alexander Fraser
(Based on material from Lars Vogel and T. Bögel)
July 2, 2014
1 / 62
![Page 2: Programmieren II - Unit Testing & Test-Driven Development · 2014-07-03 · Outline 1 Recap 2 Testing-Introduction GeneralTesting ComponentTests 3 Testinginmoredetail Equivalenceclasses](https://reader034.vdocuments.us/reader034/viewer/2022042116/5e93d667ecc62629a240e1e4/html5/thumbnails/2.jpg)
Outline
1 Recap
2 Testing - IntroductionGeneral TestingComponent Tests
3 Testing in more detailEquivalence classesFundamentals of Testing
4 Test-Driven Development
5 Unit Testing in Java – JUnitIntroductionTests in Practice
6 Mocking
2 / 62
![Page 3: Programmieren II - Unit Testing & Test-Driven Development · 2014-07-03 · Outline 1 Recap 2 Testing-Introduction GeneralTesting ComponentTests 3 Testinginmoredetail Equivalenceclasses](https://reader034.vdocuments.us/reader034/viewer/2022042116/5e93d667ecc62629a240e1e4/html5/thumbnails/3.jpg)
Outline
1 Recap
2 Testing - IntroductionGeneral TestingComponent Tests
3 Testing in more detailEquivalence classesFundamentals of Testing
4 Test-Driven Development
5 Unit Testing in Java – JUnitIntroductionTests in Practice
6 Mocking
3 / 62
![Page 4: Programmieren II - Unit Testing & Test-Driven Development · 2014-07-03 · Outline 1 Recap 2 Testing-Introduction GeneralTesting ComponentTests 3 Testinginmoredetail Equivalenceclasses](https://reader034.vdocuments.us/reader034/viewer/2022042116/5e93d667ecc62629a240e1e4/html5/thumbnails/4.jpg)
OOP Principles
OOP PrinciplesMinimize Accessibility of Classes and Members (Encapsulation)Favor Composition over InheritanceProgram to an Interface, not an ImplementationThe Open-Closed Principle (open for extension, closed formodification)The Single Choice Principle (Strategy Pattern)The Liskov Substitution Principle
4 / 62
![Page 5: Programmieren II - Unit Testing & Test-Driven Development · 2014-07-03 · Outline 1 Recap 2 Testing-Introduction GeneralTesting ComponentTests 3 Testinginmoredetail Equivalenceclasses](https://reader034.vdocuments.us/reader034/viewer/2022042116/5e93d667ecc62629a240e1e4/html5/thumbnails/5.jpg)
Outline
1 Recap
2 Testing - IntroductionGeneral TestingComponent Tests
3 Testing in more detailEquivalence classesFundamentals of Testing
4 Test-Driven Development
5 Unit Testing in Java – JUnitIntroductionTests in Practice
6 Mocking
5 / 62
![Page 6: Programmieren II - Unit Testing & Test-Driven Development · 2014-07-03 · Outline 1 Recap 2 Testing-Introduction GeneralTesting ComponentTests 3 Testinginmoredetail Equivalenceclasses](https://reader034.vdocuments.us/reader034/viewer/2022042116/5e93d667ecc62629a240e1e4/html5/thumbnails/6.jpg)
Motivation for testing
In 1998, NASA lost the USD 655 Million Mars Climate Orbiter“The peer review preliminary findings indicate that one team usedEnglish units (e.g., inches, feet and pounds) while the other usedmetric units for a key spacecraft operation.”Finding: had the interface between the two teams been extensivelytested, this could have been avoided
http://thephp.cc/viewpoints/blog/2014/03/disintegration-testing
6 / 62
![Page 7: Programmieren II - Unit Testing & Test-Driven Development · 2014-07-03 · Outline 1 Recap 2 Testing-Introduction GeneralTesting ComponentTests 3 Testinginmoredetail Equivalenceclasses](https://reader034.vdocuments.us/reader034/viewer/2022042116/5e93d667ecc62629a240e1e4/html5/thumbnails/7.jpg)
Motivation for unit testing
Why should you write unit tests?Make sure your code does what you want it to doSpeed up development and optimization/refactoringCreate better interfaces and functionalityGet other people to use your contributionMake sure nobody else breaks your feature(Also, make sure you don’t break your feature)
http://ed.agadak.net/2008/03/why-you-should-write-unit-tests
7 / 62
![Page 8: Programmieren II - Unit Testing & Test-Driven Development · 2014-07-03 · Outline 1 Recap 2 Testing-Introduction GeneralTesting ComponentTests 3 Testinginmoredetail Equivalenceclasses](https://reader034.vdocuments.us/reader034/viewer/2022042116/5e93d667ecc62629a240e1e4/html5/thumbnails/8.jpg)
Good testing is not trivial
Appropriate number of test cases?Implementing tests is tedious (stubs, mock objects etc.)
Categories of test casesLogical test cases: value ranges for input/outputConcrete test cases: specific values for input/output
8 / 62
![Page 9: Programmieren II - Unit Testing & Test-Driven Development · 2014-07-03 · Outline 1 Recap 2 Testing-Introduction GeneralTesting ComponentTests 3 Testinginmoredetail Equivalenceclasses](https://reader034.vdocuments.us/reader034/viewer/2022042116/5e93d667ecc62629a240e1e4/html5/thumbnails/9.jpg)
Typical test methods
Black box approachTesting an object as an interfaceNo control about the internal structure of the test objectInterface knowledgeExamples: equivalence classes, boundary cases, state of objects
White box approachTesting different flows within a test objectExploits knowledge about the internal structure (code)Examples: coverage of statements, branches, conditions, paths
9 / 62
![Page 10: Programmieren II - Unit Testing & Test-Driven Development · 2014-07-03 · Outline 1 Recap 2 Testing-Introduction GeneralTesting ComponentTests 3 Testinginmoredetail Equivalenceclasses](https://reader034.vdocuments.us/reader034/viewer/2022042116/5e93d667ecc62629a240e1e4/html5/thumbnails/10.jpg)
Test methods
Positive testCorrect input (expects correct results)
Negative testInvalid input (expects appropriate exception handling)
Intuitive/empirical testBased on knowledge about error situationsShould be tested alongside systematic test methods
10 / 62
![Page 11: Programmieren II - Unit Testing & Test-Driven Development · 2014-07-03 · Outline 1 Recap 2 Testing-Introduction GeneralTesting ComponentTests 3 Testinginmoredetail Equivalenceclasses](https://reader034.vdocuments.us/reader034/viewer/2022042116/5e93d667ecc62629a240e1e4/html5/thumbnails/11.jpg)
Test execution
Test framework (often: requirement to run tests)
11 / 62
![Page 12: Programmieren II - Unit Testing & Test-Driven Development · 2014-07-03 · Outline 1 Recap 2 Testing-Introduction GeneralTesting ComponentTests 3 Testinginmoredetail Equivalenceclasses](https://reader034.vdocuments.us/reader034/viewer/2022042116/5e93d667ecc62629a240e1e4/html5/thumbnails/12.jpg)
Component tests
Component testsComponent: self-contained unit of code, e.g. class, method, moduleWhite box and black box testing
Common errorsCode does not terminateErroneous or missing resultUnexpected or wrong error messageInconsistent state of memoryUnnecessary requirement of resourcesUnexpected behavior (e.g. crash)
12 / 62
![Page 13: Programmieren II - Unit Testing & Test-Driven Development · 2014-07-03 · Outline 1 Recap 2 Testing-Introduction GeneralTesting ComponentTests 3 Testinginmoredetail Equivalenceclasses](https://reader034.vdocuments.us/reader034/viewer/2022042116/5e93d667ecc62629a240e1e4/html5/thumbnails/13.jpg)
Black box component test
Testing a self-contained unit, e.g. an operationTypical test methods
Empirical or random testsEquivalence classes (especially borderline cases)State assessments
Is unable to detect redundant parts of the code
13 / 62
![Page 14: Programmieren II - Unit Testing & Test-Driven Development · 2014-07-03 · Outline 1 Recap 2 Testing-Introduction GeneralTesting ComponentTests 3 Testinginmoredetail Equivalenceclasses](https://reader034.vdocuments.us/reader034/viewer/2022042116/5e93d667ecc62629a240e1e4/html5/thumbnails/14.jpg)
Outline
1 Recap
2 Testing - IntroductionGeneral TestingComponent Tests
3 Testing in more detailEquivalence classesFundamentals of Testing
4 Test-Driven Development
5 Unit Testing in Java – JUnitIntroductionTests in Practice
6 Mocking
14 / 62
![Page 15: Programmieren II - Unit Testing & Test-Driven Development · 2014-07-03 · Outline 1 Recap 2 Testing-Introduction GeneralTesting ComponentTests 3 Testinginmoredetail Equivalenceclasses](https://reader034.vdocuments.us/reader034/viewer/2022042116/5e93d667ecc62629a240e1e4/html5/thumbnails/15.jpg)
Example: Test cases
Determine a suitable number of test cases.
int search (int[] a, int k)pre: a.length > 0post:(result >= 0 and a[result] ==k) or(result == -1 and
(not exists i: i>=0and i< a.lengthand a[i] == k)
)
15 / 62
![Page 16: Programmieren II - Unit Testing & Test-Driven Development · 2014-07-03 · Outline 1 Recap 2 Testing-Introduction GeneralTesting ComponentTests 3 Testinginmoredetail Equivalenceclasses](https://reader034.vdocuments.us/reader034/viewer/2022042116/5e93d667ecc62629a240e1e4/html5/thumbnails/16.jpg)
Equivalence classes I
Equivalence class Subset of possible input valuesAssumption Reaction of the code is identical for all values in the
equivalence classTest cases Cover all equivalence classes: at least one representative for
each classBorderline cases Test borderline cases
Typical equivalence classesValid/invalid ranges of valuesCritical valuesSeparation into buckets of similar output values
16 / 62
![Page 17: Programmieren II - Unit Testing & Test-Driven Development · 2014-07-03 · Outline 1 Recap 2 Testing-Introduction GeneralTesting ComponentTests 3 Testinginmoredetail Equivalenceclasses](https://reader034.vdocuments.us/reader034/viewer/2022042116/5e93d667ecc62629a240e1e4/html5/thumbnails/17.jpg)
Equivalence classes II
Multiple input parameterCombine all valid equivalence classes of different input parametersCombine each invalid equivalence class with other, valid equivalenceclasses
SimplificationFrequent combinationsTesting critical values onlyRestrict test coverage to pairwise combinationsMinimal: each valid equivalence class occurs in one test case
17 / 62
![Page 18: Programmieren II - Unit Testing & Test-Driven Development · 2014-07-03 · Outline 1 Recap 2 Testing-Introduction GeneralTesting ComponentTests 3 Testinginmoredetail Equivalenceclasses](https://reader034.vdocuments.us/reader034/viewer/2022042116/5e93d667ecc62629a240e1e4/html5/thumbnails/18.jpg)
Example: equivalence classes I
Function
int search (int[] a, int k)pre: a.length > 0post:(result >= 0 and a[result] ==k) or(result == -1 and
(not exists i: i>=0and i< a.lengthand a[i] == k)
)
18 / 62
![Page 19: Programmieren II - Unit Testing & Test-Driven Development · 2014-07-03 · Outline 1 Recap 2 Testing-Introduction GeneralTesting ComponentTests 3 Testinginmoredetail Equivalenceclasses](https://reader034.vdocuments.us/reader034/viewer/2022042116/5e93d667ecc62629a240e1e4/html5/thumbnails/19.jpg)
Example: equivalence classes II
Valid equivalence classesParam1: a.length > 0
Param2: k in a, k not in a
Refinement for param1 :a.length = 1a.length > 1
Refinement for param2 :k is firstin the middlelast element of anot in a
Invalid equivalence classParam1: a.length=0
19 / 62
![Page 20: Programmieren II - Unit Testing & Test-Driven Development · 2014-07-03 · Outline 1 Recap 2 Testing-Introduction GeneralTesting ComponentTests 3 Testinginmoredetail Equivalenceclasses](https://reader034.vdocuments.us/reader034/viewer/2022042116/5e93d667ecc62629a240e1e4/html5/thumbnails/20.jpg)
Test cases
a element k result[] (a.length=0) x invalid[x] (a.length=1) x (in a) 1[y] (a.length=1) x (not in a) -1[. . . , x, . . . ] (a.length>1) x (in the middle of a) n[. . . ] (a.length>1) x (not in a) -1[x,. . . ] (a.length>1) x (first element of a) 1[. . . ,x] (a.length>1) x (last element of a) n
20 / 62
![Page 21: Programmieren II - Unit Testing & Test-Driven Development · 2014-07-03 · Outline 1 Recap 2 Testing-Introduction GeneralTesting ComponentTests 3 Testinginmoredetail Equivalenceclasses](https://reader034.vdocuments.us/reader034/viewer/2022042116/5e93d667ecc62629a240e1e4/html5/thumbnails/21.jpg)
State assessment
Considers not only input/output, but also history of states of acomponentExample: StackStates: initial, empty, filled, full, deletedSuccessful test: cover all states and branches at least once
21 / 62
![Page 22: Programmieren II - Unit Testing & Test-Driven Development · 2014-07-03 · Outline 1 Recap 2 Testing-Introduction GeneralTesting ComponentTests 3 Testinginmoredetail Equivalenceclasses](https://reader034.vdocuments.us/reader034/viewer/2022042116/5e93d667ecc62629a240e1e4/html5/thumbnails/22.jpg)
White box test
Coverage of statementsCoverage of branchesCoverage of pathsRequirement: control flow diagram
Main advantageEach part of the code is tested
DisadvantagesDifficulty of finding appropriate input values to cover all pathsDifficulty of finding appropriate output values
→ usually: Grey Box testing
22 / 62
![Page 23: Programmieren II - Unit Testing & Test-Driven Development · 2014-07-03 · Outline 1 Recap 2 Testing-Introduction GeneralTesting ComponentTests 3 Testinginmoredetail Equivalenceclasses](https://reader034.vdocuments.us/reader034/viewer/2022042116/5e93d667ecc62629a240e1e4/html5/thumbnails/23.jpg)
Testing Classes I
Defining a structure of testsConstructorsGettersBoolean MethodsSettersIteratorsComplex computationsOther methods(Destructors)
23 / 62
![Page 24: Programmieren II - Unit Testing & Test-Driven Development · 2014-07-03 · Outline 1 Recap 2 Testing-Introduction GeneralTesting ComponentTests 3 Testinginmoredetail Equivalenceclasses](https://reader034.vdocuments.us/reader034/viewer/2022042116/5e93d667ecc62629a240e1e4/html5/thumbnails/24.jpg)
Testing Classes II
Testing interactions between methodsDependencies between methods
Non-modal: no dependencyUni-modal: fixed order (e.g. traffic light)Quasi-modal: content dependent order (e.g. Stack)Modal: functional dependency (e.g. bank account)
24 / 62
![Page 25: Programmieren II - Unit Testing & Test-Driven Development · 2014-07-03 · Outline 1 Recap 2 Testing-Introduction GeneralTesting ComponentTests 3 Testinginmoredetail Equivalenceclasses](https://reader034.vdocuments.us/reader034/viewer/2022042116/5e93d667ecc62629a240e1e4/html5/thumbnails/25.jpg)
Fundamentals of Testing I
Principle 1Complete test coverage is impossible.
Principle 2“Program testing can be used to show the presence of bugs, but never toshow their absence!” Edsger Dijkstra
Principle 3Write tests early! Don’t defer them to the end of the development cycle!
Principle 4Bugs are not evenly distributed across the code. If a component containsmultiple bugs, it is likely to contain even more.
25 / 62
![Page 26: Programmieren II - Unit Testing & Test-Driven Development · 2014-07-03 · Outline 1 Recap 2 Testing-Introduction GeneralTesting ComponentTests 3 Testinginmoredetail Equivalenceclasses](https://reader034.vdocuments.us/reader034/viewer/2022042116/5e93d667ecc62629a240e1e4/html5/thumbnails/26.jpg)
Fundamentals of Testing II
Principle 5Repeating tests doesn’t give you new insights. You need to assess, updateand modify your test cases.
Principle 6Testing depends on the context and the application. Security relevantcode needs to be tested more thoroughly. (Thanks, Captain Obvious!)
Principle 7A program without bugs does not necessary fulfill the specification of aclient.
Principle 8Challenge: minimal number of test cases (= invested time) vs. highestquality.
26 / 62
![Page 27: Programmieren II - Unit Testing & Test-Driven Development · 2014-07-03 · Outline 1 Recap 2 Testing-Introduction GeneralTesting ComponentTests 3 Testinginmoredetail Equivalenceclasses](https://reader034.vdocuments.us/reader034/viewer/2022042116/5e93d667ecc62629a240e1e4/html5/thumbnails/27.jpg)
Outline
1 Recap
2 Testing - IntroductionGeneral TestingComponent Tests
3 Testing in more detailEquivalence classesFundamentals of Testing
4 Test-Driven Development
5 Unit Testing in Java – JUnitIntroductionTests in Practice
6 Mocking
27 / 62
![Page 28: Programmieren II - Unit Testing & Test-Driven Development · 2014-07-03 · Outline 1 Recap 2 Testing-Introduction GeneralTesting ComponentTests 3 Testinginmoredetail Equivalenceclasses](https://reader034.vdocuments.us/reader034/viewer/2022042116/5e93d667ecc62629a240e1e4/html5/thumbnails/28.jpg)
Test-Driven Development
Test-Driven DevelopmentTest-first approachThinking about tests before implementing functionalityWriting tests before programming
AdvantagesAll code is testedForces you to think about functionality your code needs to provideSimple solutions (KISS): writing the smallest amount of code to makethe test pass
Alternative programming workflow.
28 / 62
![Page 29: Programmieren II - Unit Testing & Test-Driven Development · 2014-07-03 · Outline 1 Recap 2 Testing-Introduction GeneralTesting ComponentTests 3 Testinginmoredetail Equivalenceclasses](https://reader034.vdocuments.us/reader034/viewer/2022042116/5e93d667ecc62629a240e1e4/html5/thumbnails/29.jpg)
Fear
Test-driven development is a way of managing fear duringprogramming. (Beck, 2002)
Start simply.Write automated tests.Refactor to add design decisions one at a time.
29 / 62
![Page 30: Programmieren II - Unit Testing & Test-Driven Development · 2014-07-03 · Outline 1 Recap 2 Testing-Introduction GeneralTesting ComponentTests 3 Testinginmoredetail Equivalenceclasses](https://reader034.vdocuments.us/reader034/viewer/2022042116/5e93d667ecc62629a240e1e4/html5/thumbnails/30.jpg)
The secrets of the ancients – 1960s
It was just assumed that any pro would do a damn good job ofthis activity, not to be embarrassed by unit bugs found inintegration test or system test – or god help us, in production.(Jerry Weinberg)1
1source: http://secretsofconsulting.blogspot.de/2008/12/how-we-used-to-do-unit-testing.html
30 / 62
![Page 31: Programmieren II - Unit Testing & Test-Driven Development · 2014-07-03 · Outline 1 Recap 2 Testing-Introduction GeneralTesting ComponentTests 3 Testinginmoredetail Equivalenceclasses](https://reader034.vdocuments.us/reader034/viewer/2022042116/5e93d667ecc62629a240e1e4/html5/thumbnails/31.jpg)
The secrets of the ancients – 1970s
It said the way to program is to look at the input tape andmanually type in the output tape you expect. Then you programuntil the actual and expected tapes match.
I thought, what a stupid idea. I want tests that pass, not teststhat fail. Why would I write a test when I was sure it would fail.Well, I’m in the habit of trying stupid things out just to seewhat happens, so I tried it and it worked great.
31 / 62
![Page 32: Programmieren II - Unit Testing & Test-Driven Development · 2014-07-03 · Outline 1 Recap 2 Testing-Introduction GeneralTesting ComponentTests 3 Testinginmoredetail Equivalenceclasses](https://reader034.vdocuments.us/reader034/viewer/2022042116/5e93d667ecc62629a240e1e4/html5/thumbnails/32.jpg)
Rhythm of TDD
1 Quickly add a test.2 Run all tests and see the new one fail.3 Make a little change.4 Run all tests and see them all succeed.5 Refactor to remove duplication.
32 / 62
![Page 33: Programmieren II - Unit Testing & Test-Driven Development · 2014-07-03 · Outline 1 Recap 2 Testing-Introduction GeneralTesting ComponentTests 3 Testinginmoredetail Equivalenceclasses](https://reader034.vdocuments.us/reader034/viewer/2022042116/5e93d667ecc62629a240e1e4/html5/thumbnails/33.jpg)
Outline
1 Recap
2 Testing - IntroductionGeneral TestingComponent Tests
3 Testing in more detailEquivalence classesFundamentals of Testing
4 Test-Driven Development
5 Unit Testing in Java – JUnitIntroductionTests in Practice
6 Mocking
33 / 62
![Page 34: Programmieren II - Unit Testing & Test-Driven Development · 2014-07-03 · Outline 1 Recap 2 Testing-Introduction GeneralTesting ComponentTests 3 Testinginmoredetail Equivalenceclasses](https://reader034.vdocuments.us/reader034/viewer/2022042116/5e93d667ecc62629a240e1e4/html5/thumbnails/34.jpg)
JUnit test framework
Based on the tutorial by Lars Vogel:http://www.vogella.com/articles/JUnit/article.html
JUnit TestClassSeparate class for testing (test class) that contains multiple test methodsTest methods indicated by annotationsRequirement: all methods can be executed in an arbitrary order (no dependencies)
Writing a test methodAnnotate a method with @org.junit.Test annotationUse a JUnit method to check the expected result versus the actual result
34 / 62
![Page 35: Programmieren II - Unit Testing & Test-Driven Development · 2014-07-03 · Outline 1 Recap 2 Testing-Introduction GeneralTesting ComponentTests 3 Testinginmoredetail Equivalenceclasses](https://reader034.vdocuments.us/reader034/viewer/2022042116/5e93d667ecc62629a240e1e4/html5/thumbnails/35.jpg)
JUnit annotations (version 4.x) I
@Test Specifies that a method is a test method@Before Method is executed before each test, e.g. to prepare the test
environment (reading data, initializing classes etc.)@After Method is executed after each test. Used to clean up the
test environment, e.g. delete temporary data, free memory@BeforeClass Method is executed once before the start of all tests. Use
cases: connection to a database etc. Note: methods need bebe declared as static
@AfterClass Method is executed once after all tests have been finished.Note: methods need to be declared as static
@Ignore Ignore a method@Test (expected = Exception.class) Fails, if the method does not
throw the named exception@Test(timeout=100) Fails, if the method takes longer than 100
milliseconds35 / 62
![Page 36: Programmieren II - Unit Testing & Test-Driven Development · 2014-07-03 · Outline 1 Recap 2 Testing-Introduction GeneralTesting ComponentTests 3 Testinginmoredetail Equivalenceclasses](https://reader034.vdocuments.us/reader034/viewer/2022042116/5e93d667ecc62629a240e1e4/html5/thumbnails/36.jpg)
Assert statements I
Assert statementsSpecial methods of the Assert class to test for certain conditionsRequired: expected result and actual result[message]: error message (optional)Write meaningful error messages!
fail(String): Let the method fail (e.g. to check that a certain part ofthe code is not reached)assertTrue([message], boolean condition) Checks that theboolean condition is trueassertsEquals([String message], expected, actual) Tests whethertwo values are the same
36 / 62
![Page 37: Programmieren II - Unit Testing & Test-Driven Development · 2014-07-03 · Outline 1 Recap 2 Testing-Introduction GeneralTesting ComponentTests 3 Testinginmoredetail Equivalenceclasses](https://reader034.vdocuments.us/reader034/viewer/2022042116/5e93d667ecc62629a240e1e4/html5/thumbnails/37.jpg)
Assert statements II
assertsEquals([String message], expected, actual, tolerance)Test for matching floating point values. Tolerance: number ofdecimals that need to be identicalassertNull([message], object) Checks that an object is nullassertNotNull([message], object) Checks that an object is notnull
assertSame([String], expected, actual) Checks that both variablesrefer to the same objectassertNotSame([String], expected, actual) Tests whether bothvariables refer to different objects
37 / 62
![Page 38: Programmieren II - Unit Testing & Test-Driven Development · 2014-07-03 · Outline 1 Recap 2 Testing-Introduction GeneralTesting ComponentTests 3 Testinginmoredetail Equivalenceclasses](https://reader034.vdocuments.us/reader034/viewer/2022042116/5e93d667ecc62629a240e1e4/html5/thumbnails/38.jpg)
Test Suite
Test suitesMultiple test classes can be combined into a test suiteRunning a test suite runs all corresponding test classes
Example: two test classes
import org.junit.runner.RunWith;import org.junit.runners.Suite;import org.junit.runners.Suite.SuiteClasses;
@RunWith(Suite.class)@SuiteClasses ({ TestClassA.class , TestClassB.class})public class AllTests {}
38 / 62
![Page 39: Programmieren II - Unit Testing & Test-Driven Development · 2014-07-03 · Outline 1 Recap 2 Testing-Introduction GeneralTesting ComponentTests 3 Testinginmoredetail Equivalenceclasses](https://reader034.vdocuments.us/reader034/viewer/2022042116/5e93d667ecc62629a240e1e4/html5/thumbnails/39.jpg)
Practical workflow
Outside of eclipseAdd JUnit jar file (library) to the class pathMethod runClasses() in org.junit.runner.JUnitCore: run testclassesReturns object of type org.junit.runner.Result
Result provides information about failures, successful tests etc.
Unit testing with eclipseEclipse supports most of the workflows necessary for JUnitYou should use Eclipse
39 / 62
![Page 40: Programmieren II - Unit Testing & Test-Driven Development · 2014-07-03 · Outline 1 Recap 2 Testing-Introduction GeneralTesting ComponentTests 3 Testinginmoredetail Equivalenceclasses](https://reader034.vdocuments.us/reader034/viewer/2022042116/5e93d667ecc62629a240e1e4/html5/thumbnails/40.jpg)
Class to test: Money.java I
public class Money {private final int amount;private final String currency;
public Money(int amount , String currency) {this.amount = amount;this.currency = currency;
}
public int getAmount () {return amount;
}
public String getCurrency () {return currency;
}
public boolean equals(Object anObject) {if (anObject instanceof Money) {
40 / 62
![Page 41: Programmieren II - Unit Testing & Test-Driven Development · 2014-07-03 · Outline 1 Recap 2 Testing-Introduction GeneralTesting ComponentTests 3 Testinginmoredetail Equivalenceclasses](https://reader034.vdocuments.us/reader034/viewer/2022042116/5e93d667ecc62629a240e1e4/html5/thumbnails/41.jpg)
Class to test: Money.java II
Money money = (Money) anObject;return money.getCurrency ().equals(getCurrency ())&& getAmount () == money.getAmount ();
}return false;
}}
41 / 62
![Page 42: Programmieren II - Unit Testing & Test-Driven Development · 2014-07-03 · Outline 1 Recap 2 Testing-Introduction GeneralTesting ComponentTests 3 Testinginmoredetail Equivalenceclasses](https://reader034.vdocuments.us/reader034/viewer/2022042116/5e93d667ecc62629a240e1e4/html5/thumbnails/42.jpg)
Testing Money.java I
Things to testConstructorequals() method
42 / 62
![Page 43: Programmieren II - Unit Testing & Test-Driven Development · 2014-07-03 · Outline 1 Recap 2 Testing-Introduction GeneralTesting ComponentTests 3 Testinginmoredetail Equivalenceclasses](https://reader034.vdocuments.us/reader034/viewer/2022042116/5e93d667ecc62629a240e1e4/html5/thumbnails/43.jpg)
Testing Money.java II
Testing the constructor
import static org.junit.Assert .*;import org.junit.Test;
public class MoneyTest {
@Testpublic void constructorShouldSetAmountAndCurrency () {
Money m = new Money(10, "USD");
assertEquals (10, m.getAmount ());assertEquals("USD", m.getCurrency ());
}}
43 / 62
![Page 44: Programmieren II - Unit Testing & Test-Driven Development · 2014-07-03 · Outline 1 Recap 2 Testing-Introduction GeneralTesting ComponentTests 3 Testinginmoredetail Equivalenceclasses](https://reader034.vdocuments.us/reader034/viewer/2022042116/5e93d667ecc62629a240e1e4/html5/thumbnails/44.jpg)
Testing for exceptions I
Modification of the constructorIf amount < 0 or an invalid currency is used: throwIllegalArgumentException
44 / 62
![Page 45: Programmieren II - Unit Testing & Test-Driven Development · 2014-07-03 · Outline 1 Recap 2 Testing-Introduction GeneralTesting ComponentTests 3 Testinginmoredetail Equivalenceclasses](https://reader034.vdocuments.us/reader034/viewer/2022042116/5e93d667ecc62629a240e1e4/html5/thumbnails/45.jpg)
Testing for exceptions II
Modified constructor
public Money(int amount , String currency) {if (amount < 0) {
throw new IllegalArgumentException("illegal amount: [" + amount + "]");
}
if (currency == null || currency.isEmpty ()) {throw new IllegalArgumentException(
"illegal currency: [" + currency + "]");}this.amount = amount;this.currency = currency;
}
45 / 62
![Page 46: Programmieren II - Unit Testing & Test-Driven Development · 2014-07-03 · Outline 1 Recap 2 Testing-Introduction GeneralTesting ComponentTests 3 Testinginmoredetail Equivalenceclasses](https://reader034.vdocuments.us/reader034/viewer/2022042116/5e93d667ecc62629a240e1e4/html5/thumbnails/46.jpg)
Testing for exceptions III
Testing for the occurrence of an exception
@Test(expected = IllegalArgumentException.class)public void constructorShouldThrowIAEForInvalidAmount () {
Money m = new Money(-10,"USD");}
46 / 62
![Page 47: Programmieren II - Unit Testing & Test-Driven Development · 2014-07-03 · Outline 1 Recap 2 Testing-Introduction GeneralTesting ComponentTests 3 Testinginmoredetail Equivalenceclasses](https://reader034.vdocuments.us/reader034/viewer/2022042116/5e93d667ecc62629a240e1e4/html5/thumbnails/47.jpg)
Testing for exceptions IV
Running the tests from the command line
import org.junit.runner.JUnitCore;import org.junit.runner.Result;import org.junit.runner.notification.Failure;
public class MoneyTestRunner {public static void main(String [] args) {
Result result = JUnitCore.runClasses(MoneyTest.class);for (Failure failure : result.getFailures ()) {
System.out.println(failure.toString ());}
}}
47 / 62
![Page 48: Programmieren II - Unit Testing & Test-Driven Development · 2014-07-03 · Outline 1 Recap 2 Testing-Introduction GeneralTesting ComponentTests 3 Testinginmoredetail Equivalenceclasses](https://reader034.vdocuments.us/reader034/viewer/2022042116/5e93d667ecc62629a240e1e4/html5/thumbnails/48.jpg)
Creating and running tests from eclipse
Simply do File − > New − > JUnit testIt will ask you for which class file you want to write a testType in the test, and run it to see if it passes
48 / 62
![Page 49: Programmieren II - Unit Testing & Test-Driven Development · 2014-07-03 · Outline 1 Recap 2 Testing-Introduction GeneralTesting ComponentTests 3 Testinginmoredetail Equivalenceclasses](https://reader034.vdocuments.us/reader034/viewer/2022042116/5e93d667ecc62629a240e1e4/html5/thumbnails/49.jpg)
Client and Address
Client and AddressClient: a client stores a collection of Address objectsAddress: one address of a clientWe start with the test
49 / 62
![Page 50: Programmieren II - Unit Testing & Test-Driven Development · 2014-07-03 · Outline 1 Recap 2 Testing-Introduction GeneralTesting ComponentTests 3 Testinginmoredetail Equivalenceclasses](https://reader034.vdocuments.us/reader034/viewer/2022042116/5e93d667ecc62629a240e1e4/html5/thumbnails/50.jpg)
Testing Client I
public class ClientTest {private Address addressA = new Address("street A");private Address addressB = new Address("street B");
@Testpublic void afterCreationShouldHaveNoAddress () {
Client client = new Client ();assertEquals (0, client.getAddresses ().size());
}
@Testpublic void shouldAllowToAddAddress () {
Client client = new Client ();client.addAddress(addressA);assertEquals (1, client.getAddresses ().size());assertTrue(client.getAddresses ().contains(addressA));
}
@Test
50 / 62
![Page 51: Programmieren II - Unit Testing & Test-Driven Development · 2014-07-03 · Outline 1 Recap 2 Testing-Introduction GeneralTesting ComponentTests 3 Testinginmoredetail Equivalenceclasses](https://reader034.vdocuments.us/reader034/viewer/2022042116/5e93d667ecc62629a240e1e4/html5/thumbnails/51.jpg)
Testing Client II
public void shouldAllowToAddManyAddresses () {Client client = new Client ();client.addAddress(addressA);client.addAddress(addressB);assertEquals (2, client.getAddresses ().size());assertTrue(client.getAddresses ().contains(addressA));assertTrue(client.getAddresses ().contains(addressB));}
}
→ problematic: code duplication (Client is instantiated in each method).
51 / 62
![Page 52: Programmieren II - Unit Testing & Test-Driven Development · 2014-07-03 · Outline 1 Recap 2 Testing-Introduction GeneralTesting ComponentTests 3 Testinginmoredetail Equivalenceclasses](https://reader034.vdocuments.us/reader034/viewer/2022042116/5e93d667ecc62629a240e1e4/html5/thumbnails/52.jpg)
Creating Address
Address.java
Address only needs to store an address as a StringConstructor expects the string
public class Address {private String address;
public Address(String add) {this.address = add;
}
public String getAddress () {return this.address;
}}
52 / 62
![Page 53: Programmieren II - Unit Testing & Test-Driven Development · 2014-07-03 · Outline 1 Recap 2 Testing-Introduction GeneralTesting ComponentTests 3 Testinginmoredetail Equivalenceclasses](https://reader034.vdocuments.us/reader034/viewer/2022042116/5e93d667ecc62629a240e1e4/html5/thumbnails/53.jpg)
Creating Client I
Implementing ClientsCollection of Address objectsSize of collection is 0 after instantiationProvides methods for adding an address and getting all addresses
53 / 62
![Page 54: Programmieren II - Unit Testing & Test-Driven Development · 2014-07-03 · Outline 1 Recap 2 Testing-Introduction GeneralTesting ComponentTests 3 Testinginmoredetail Equivalenceclasses](https://reader034.vdocuments.us/reader034/viewer/2022042116/5e93d667ecc62629a240e1e4/html5/thumbnails/54.jpg)
Creating Client IIClient.java
public class Client {
private List <Address > addresses;
public Client () {this.addresses = new ArrayList <Address >();
}
public List <Address > getAddresses () {return addresses;
}
public void addAddress(Address newAddress) {this.addresses.add(newAddress);
}
}
54 / 62
![Page 55: Programmieren II - Unit Testing & Test-Driven Development · 2014-07-03 · Outline 1 Recap 2 Testing-Introduction GeneralTesting ComponentTests 3 Testinginmoredetail Equivalenceclasses](https://reader034.vdocuments.us/reader034/viewer/2022042116/5e93d667ecc62629a240e1e4/html5/thumbnails/55.jpg)
Running initialization before testing
To avoid to repeat the same code for each test: @Before annotation
public class ClientTest {private Address addressA = new Address("street A");private Address addressB = new Address("street B");private Client client;
@Beforepublic void setUp() {
client = new Client ();}
// the rest of the code identical to the previous listing...
}
55 / 62
![Page 56: Programmieren II - Unit Testing & Test-Driven Development · 2014-07-03 · Outline 1 Recap 2 Testing-Introduction GeneralTesting ComponentTests 3 Testinginmoredetail Equivalenceclasses](https://reader034.vdocuments.us/reader034/viewer/2022042116/5e93d667ecc62629a240e1e4/html5/thumbnails/56.jpg)
assert vs. assertTrue
Java defines an assert statement which is only actually checked if yougive the jvm the “-ea” argument
The (good) intention is to allow programmers to develop using “-ea”and then to leave it away when code is in productionUnfortunately, in practice people don’t use this!
Instead use methods like assertTrue from JUnit in your code(everywhere, not only in tests)
import static org.junit.Assert .*
public void myMethod(int i) {
// code here modifies i, should never result in i beingless than 1
assertTrue("myMethod: i not greater than 0", i>0);}
56 / 62
![Page 57: Programmieren II - Unit Testing & Test-Driven Development · 2014-07-03 · Outline 1 Recap 2 Testing-Introduction GeneralTesting ComponentTests 3 Testinginmoredetail Equivalenceclasses](https://reader034.vdocuments.us/reader034/viewer/2022042116/5e93d667ecc62629a240e1e4/html5/thumbnails/57.jpg)
Outline
1 Recap
2 Testing - IntroductionGeneral TestingComponent Tests
3 Testing in more detailEquivalence classesFundamentals of Testing
4 Test-Driven Development
5 Unit Testing in Java – JUnitIntroductionTests in Practice
6 Mocking
57 / 62
![Page 58: Programmieren II - Unit Testing & Test-Driven Development · 2014-07-03 · Outline 1 Recap 2 Testing-Introduction GeneralTesting ComponentTests 3 Testinginmoredetail Equivalenceclasses](https://reader034.vdocuments.us/reader034/viewer/2022042116/5e93d667ecc62629a240e1e4/html5/thumbnails/58.jpg)
What is mocking?
MotivationJava classes usually depend on other classesMock object: dummy implementation for interface or classUser-defined output of certain method callsBenefit: testing without dependenciesThis is a commonly used form of integration testing (think of MarsClimate Observer)Example: data provider (database replacement)
Creating mock objectsManually (via code)Mock framework: create mock objects at runtime and define theirbehavior
58 / 62
![Page 59: Programmieren II - Unit Testing & Test-Driven Development · 2014-07-03 · Outline 1 Recap 2 Testing-Introduction GeneralTesting ComponentTests 3 Testinginmoredetail Equivalenceclasses](https://reader034.vdocuments.us/reader034/viewer/2022042116/5e93d667ecc62629a240e1e4/html5/thumbnails/59.jpg)
Mock frameworks
jMockhttp://jmock.org/
EasyMockhttp://easymock.org/
Mockitohttp://code.google.com/p/mockito/
59 / 62
![Page 60: Programmieren II - Unit Testing & Test-Driven Development · 2014-07-03 · Outline 1 Recap 2 Testing-Introduction GeneralTesting ComponentTests 3 Testinginmoredetail Equivalenceclasses](https://reader034.vdocuments.us/reader034/viewer/2022042116/5e93d667ecc62629a240e1e4/html5/thumbnails/60.jpg)
Example: EasyMock I
Object instantiation
// ICalcMethod is the object which is mockedICalcMethod calcMethod = EasyMock.createMock(ICalcMethod.class)
;
60 / 62
![Page 61: Programmieren II - Unit Testing & Test-Driven Development · 2014-07-03 · Outline 1 Recap 2 Testing-Introduction GeneralTesting ComponentTests 3 Testinginmoredetail Equivalenceclasses](https://reader034.vdocuments.us/reader034/viewer/2022042116/5e93d667ecc62629a240e1e4/html5/thumbnails/61.jpg)
Example: EasyMock II
Specifying outputexpect(): simulate a method with certain argumentsandReturn(): return value of the method for specified parameterstimes(): how often the Mock object will be called
// setup the mock objectexpect(calcMethod.calc(Position.BOSS)).andReturn (70000.0).times
(2);expect(calcMethod.calc(Position.PROGRAMMER)).andReturn (50000.0)
;// Setup is finished need to activate the mockreplay(calcMethod);
61 / 62
![Page 62: Programmieren II - Unit Testing & Test-Driven Development · 2014-07-03 · Outline 1 Recap 2 Testing-Introduction GeneralTesting ComponentTests 3 Testinginmoredetail Equivalenceclasses](https://reader034.vdocuments.us/reader034/viewer/2022042116/5e93d667ecc62629a240e1e4/html5/thumbnails/62.jpg)
Literature
Vogel, Lars.JUnit - Tutorialhttp://www.vogella.com/articles/JUnit/article.html
Ullenboom, Ch.Javainsel-Blog: Java Tests mit Junithttp://www.tutego.de/blog/javainsel/2010/04/junit-4-tutorial-java-tests-mit-junit
Beck, Kent.Test Driven Development: By Example.Addison-Wesley Professional, 2002.
62 / 62