![Page 1: Software Engineering I (02161) · Software Engineering I (02161) Week 3 Assoc. Prof. Hubert Baumeister DTU Compute Technical University of Denmark Spring 2018. Contents Systematic](https://reader034.vdocuments.net/reader034/viewer/2022050218/5f63ffbe9d07ef73c34db03c/html5/thumbnails/1.jpg)
Software Engineering I (02161)Week 3
Assoc. Prof. Hubert Baumeister
DTU ComputeTechnical University of Denmark
Spring 2018
![Page 2: Software Engineering I (02161) · Software Engineering I (02161) Week 3 Assoc. Prof. Hubert Baumeister DTU Compute Technical University of Denmark Spring 2018. Contents Systematic](https://reader034.vdocuments.net/reader034/viewer/2022050218/5f63ffbe9d07ef73c34db03c/html5/thumbnails/2.jpg)
Contents
Systematic tests
Code coverage
Refactoring
![Page 3: Software Engineering I (02161) · Software Engineering I (02161) Week 3 Assoc. Prof. Hubert Baumeister DTU Compute Technical University of Denmark Spring 2018. Contents Systematic](https://reader034.vdocuments.net/reader034/viewer/2022050218/5f63ffbe9d07ef73c34db03c/html5/thumbnails/3.jpg)
Systematic testing
I Tests are expensiveI Impractical to test all input valuesI Not too few because one could miss some defects→ Partition based testsI Paper by Peter Sestoft (availalbe from the course home
page)
![Page 4: Software Engineering I (02161) · Software Engineering I (02161) Week 3 Assoc. Prof. Hubert Baumeister DTU Compute Technical University of Denmark Spring 2018. Contents Systematic](https://reader034.vdocuments.net/reader034/viewer/2022050218/5f63ffbe9d07ef73c34db03c/html5/thumbnails/4.jpg)
Partition based tests
I Tests test expectedbehaviour
I SUT (System under test)I Partition: All elements
behave the same under atest
I Choice of partitionsdepends on tests
![Page 5: Software Engineering I (02161) · Software Engineering I (02161) Week 3 Assoc. Prof. Hubert Baumeister DTU Compute Technical University of Denmark Spring 2018. Contents Systematic](https://reader034.vdocuments.net/reader034/viewer/2022050218/5f63ffbe9d07ef73c34db03c/html5/thumbnails/5.jpg)
Partition based tests: Black box
I Expected behaviour:isEven(n)
I SUT implementation ofisEven(n)
![Page 6: Software Engineering I (02161) · Software Engineering I (02161) Week 3 Assoc. Prof. Hubert Baumeister DTU Compute Technical University of Denmark Spring 2018. Contents Systematic](https://reader034.vdocuments.net/reader034/viewer/2022050218/5f63ffbe9d07ef73c34db03c/html5/thumbnails/6.jpg)
Partition based tests: White Box
I Expected behaviour: isEven(n)I SUT implementation of isEven(n)
public boolean isEven(int n) {if (n % 2 == 0) {
return true;} else {
return false;}
}
![Page 7: Software Engineering I (02161) · Software Engineering I (02161) Week 3 Assoc. Prof. Hubert Baumeister DTU Compute Technical University of Denmark Spring 2018. Contents Systematic](https://reader034.vdocuments.net/reader034/viewer/2022050218/5f63ffbe9d07ef73c34db03c/html5/thumbnails/7.jpg)
Partition based tests: White Box
I Expected behaviour: isEven(n)I SUT implementation of isEven(n)
public boolean isEven(int n) {if (n == 101) return true;if (n % 2 == 0) {
return true;} else {
return false;}
}
![Page 8: Software Engineering I (02161) · Software Engineering I (02161) Week 3 Assoc. Prof. Hubert Baumeister DTU Compute Technical University of Denmark Spring 2018. Contents Systematic](https://reader034.vdocuments.net/reader034/viewer/2022050218/5f63ffbe9d07ef73c34db03c/html5/thumbnails/8.jpg)
How to find the right partitions?
1. white box test / structural test2. black box test / functional test
![Page 9: Software Engineering I (02161) · Software Engineering I (02161) Week 3 Assoc. Prof. Hubert Baumeister DTU Compute Technical University of Denmark Spring 2018. Contents Systematic](https://reader034.vdocuments.net/reader034/viewer/2022050218/5f63ffbe9d07ef73c34db03c/html5/thumbnails/9.jpg)
White Box testsI Find the minimum and the maximum of a list of integers
I Partition: Path from method entry to exitI Input property = conjunction of all conditions on path
![Page 10: Software Engineering I (02161) · Software Engineering I (02161) Week 3 Assoc. Prof. Hubert Baumeister DTU Compute Technical University of Denmark Spring 2018. Contents Systematic](https://reader034.vdocuments.net/reader034/viewer/2022050218/5f63ffbe9d07ef73c34db03c/html5/thumbnails/10.jpg)
Example of a white box test (II): Test cases
![Page 11: Software Engineering I (02161) · Software Engineering I (02161) Week 3 Assoc. Prof. Hubert Baumeister DTU Compute Technical University of Denmark Spring 2018. Contents Systematic](https://reader034.vdocuments.net/reader034/viewer/2022050218/5f63ffbe9d07ef73c34db03c/html5/thumbnails/11.jpg)
JUnit Tests
public class WhiteBoxTest {MinMax sut = new MinMax();
@Test(expected = Error.class)public void testInputDataSetA() {int[] ar = {};sut.minmax(ar);
}
@Testpublic void testInputDataSetB() {int[] ar = {17};sut.minmax(ar);assertEquals(17,sut.getMin());assertEquals(17,sut.getMax());
}
@Testpublic void testInputDataSetC() {int[] ar = {27, 29};sut.minmax(ar);assertEquals(27,sut.getMin());assertEquals(29,sut.getMax());
}
![Page 12: Software Engineering I (02161) · Software Engineering I (02161) Week 3 Assoc. Prof. Hubert Baumeister DTU Compute Technical University of Denmark Spring 2018. Contents Systematic](https://reader034.vdocuments.net/reader034/viewer/2022050218/5f63ffbe9d07ef73c34db03c/html5/thumbnails/12.jpg)
JUnit Tests (cont.)
@Testpublic void testInputDataSetD() {int[] ar = {39, 37};sut.minmax(ar);assertEquals(37,sut.getMin());assertEquals(39,sut.getMax());
}
@Testpublic void testInputDataSetE() {int[] ar = {49, 47, 48};sut.minmax(ar);assertEquals(47,sut.getMin());assertEquals(49,sut.getMax());
}
@Testpublic void testInputDataSetF() {int[] ar = {47, 49, 48};sut.minmax(ar);assertEquals(47,sut.getMin());assertEquals(49,sut.getMax());
}
}
![Page 13: Software Engineering I (02161) · Software Engineering I (02161) Week 3 Assoc. Prof. Hubert Baumeister DTU Compute Technical University of Denmark Spring 2018. Contents Systematic](https://reader034.vdocuments.net/reader034/viewer/2022050218/5f63ffbe9d07ef73c34db03c/html5/thumbnails/13.jpg)
Example of a black box test (I): min, max computation
Problem: Find the minimum and the maximum of a list ofintegers
I What are the partitions?
![Page 14: Software Engineering I (02161) · Software Engineering I (02161) Week 3 Assoc. Prof. Hubert Baumeister DTU Compute Technical University of Denmark Spring 2018. Contents Systematic](https://reader034.vdocuments.net/reader034/viewer/2022050218/5f63ffbe9d07ef73c34db03c/html5/thumbnails/14.jpg)
Example of a black box test (I): min, max computation
Problem: Find the minimum and the maximum of a list ofintegers
Definition of the input partitions
Definition of the test values andexpected results
![Page 15: Software Engineering I (02161) · Software Engineering I (02161) Week 3 Assoc. Prof. Hubert Baumeister DTU Compute Technical University of Denmark Spring 2018. Contents Systematic](https://reader034.vdocuments.net/reader034/viewer/2022050218/5f63ffbe9d07ef73c34db03c/html5/thumbnails/15.jpg)
Example of a black box test (I): min, max computation
Problem: Find the minimum and the maximum of a list ofintegers
Definition of the input partitionsDefinition of the test values andexpected results
![Page 16: Software Engineering I (02161) · Software Engineering I (02161) Week 3 Assoc. Prof. Hubert Baumeister DTU Compute Technical University of Denmark Spring 2018. Contents Systematic](https://reader034.vdocuments.net/reader034/viewer/2022050218/5f63ffbe9d07ef73c34db03c/html5/thumbnails/16.jpg)
White box vs. Black box testing
What do you think and why?1. If there are white box tests, no black box tests are needed2. if there are black box tests, no white box tests are needed3. Both, black box and white box tests are needed all the time
![Page 17: Software Engineering I (02161) · Software Engineering I (02161) Week 3 Assoc. Prof. Hubert Baumeister DTU Compute Technical University of Denmark Spring 2018. Contents Systematic](https://reader034.vdocuments.net/reader034/viewer/2022050218/5f63ffbe9d07ef73c34db03c/html5/thumbnails/17.jpg)
White box vs. Black box testing
I White box testI finds defects in the implementationI can’t find problems with the functionality
I Ex.: Functionality: For numbers n below 100 returneven(n), for numbers 100 or above return odd(n).public boolean isEvenBelow100andOddAbove(int n) {
if (n % 2 == 0) {return true;
} else {return false;
}}
![Page 18: Software Engineering I (02161) · Software Engineering I (02161) Week 3 Assoc. Prof. Hubert Baumeister DTU Compute Technical University of Denmark Spring 2018. Contents Systematic](https://reader034.vdocuments.net/reader034/viewer/2022050218/5f63ffbe9d07ef73c34db03c/html5/thumbnails/18.jpg)
White box vs. Black box testing
I White box testI finds defects in the implementationI can’t find problems with the functionality
I Ex.: Functionality: For numbers n below 100 returneven(n), for numbers 100 or above return odd(n).public boolean isEvenBelow100andOddAbove(int n) {if (n % 2 == 0) {return true;
} else {return false;
}}
![Page 19: Software Engineering I (02161) · Software Engineering I (02161) Week 3 Assoc. Prof. Hubert Baumeister DTU Compute Technical University of Denmark Spring 2018. Contents Systematic](https://reader034.vdocuments.net/reader034/viewer/2022050218/5f63ffbe9d07ef73c34db03c/html5/thumbnails/19.jpg)
White box vs. Black box testing
I Black box testI finds problems with the functionalityI can’t find defects in the implementation
I Ex.: Functionality: For a number n return even(n)public boolean isEven(int n) {if (n == 100) {
return false;}if (n % 2 == 0) {
return true;}return false;
}
![Page 20: Software Engineering I (02161) · Software Engineering I (02161) Week 3 Assoc. Prof. Hubert Baumeister DTU Compute Technical University of Denmark Spring 2018. Contents Systematic](https://reader034.vdocuments.net/reader034/viewer/2022050218/5f63ffbe9d07ef73c34db03c/html5/thumbnails/20.jpg)
White box vs. Black box testing
I Black box testI finds problems with the functionalityI can’t find defects in the implementation
I Ex.: Functionality: For a number n return even(n)public boolean isEven(int n) {if (n == 100) {
return false;}if (n % 2 == 0) {return true;
}return false;
}
![Page 21: Software Engineering I (02161) · Software Engineering I (02161) Week 3 Assoc. Prof. Hubert Baumeister DTU Compute Technical University of Denmark Spring 2018. Contents Systematic](https://reader034.vdocuments.net/reader034/viewer/2022050218/5f63ffbe9d07ef73c34db03c/html5/thumbnails/21.jpg)
TDD vs. White box and Black box testing
I TDD: Black box + white box testingI TDD starts with tests for the functionality (black box)I Any production code that you want to write needs a failing
test (white box)→ Quality critera: 100% code coverage of tests (white box
test critera). Beware that all required functionality is testedtoo.
![Page 22: Software Engineering I (02161) · Software Engineering I (02161) Week 3 Assoc. Prof. Hubert Baumeister DTU Compute Technical University of Denmark Spring 2018. Contents Systematic](https://reader034.vdocuments.net/reader034/viewer/2022050218/5f63ffbe9d07ef73c34db03c/html5/thumbnails/22.jpg)
Contents
Systematic tests
Code coverage
Refactoring
![Page 23: Software Engineering I (02161) · Software Engineering I (02161) Week 3 Assoc. Prof. Hubert Baumeister DTU Compute Technical University of Denmark Spring 2018. Contents Systematic](https://reader034.vdocuments.net/reader034/viewer/2022050218/5f63ffbe9d07ef73c34db03c/html5/thumbnails/23.jpg)
Code coverage
I How good are the tests?→ When the tests have covered all the codeI Code coverage
I statement coverageI decision coverageI condition coverageI path coverageI . . .
![Page 24: Software Engineering I (02161) · Software Engineering I (02161) Week 3 Assoc. Prof. Hubert Baumeister DTU Compute Technical University of Denmark Spring 2018. Contents Systematic](https://reader034.vdocuments.net/reader034/viewer/2022050218/5f63ffbe9d07ef73c34db03c/html5/thumbnails/24.jpg)
Code coverage: statement, decision, condition
int foo (int x, int y){
int z = 0;if ((x>0) && (y>0)) {
z = x;}return z;
}
![Page 25: Software Engineering I (02161) · Software Engineering I (02161) Week 3 Assoc. Prof. Hubert Baumeister DTU Compute Technical University of Denmark Spring 2018. Contents Systematic](https://reader034.vdocuments.net/reader034/viewer/2022050218/5f63ffbe9d07ef73c34db03c/html5/thumbnails/25.jpg)
Code coverage: path
int foo (boolean b1, boolean b2){
if (b1) {s1;
} else {s2;
}if (b2) {
s3;} else {
s4;}
}
![Page 26: Software Engineering I (02161) · Software Engineering I (02161) Week 3 Assoc. Prof. Hubert Baumeister DTU Compute Technical University of Denmark Spring 2018. Contents Systematic](https://reader034.vdocuments.net/reader034/viewer/2022050218/5f63ffbe9d07ef73c34db03c/html5/thumbnails/26.jpg)
Coverage Tool
I Statement, decision, andcondition coverage
I EclEmma(http://eclemma.org)
I Goal: 100% test coverage→ Sufficient white box tests
I TDD helps to achieve thegoal
TestsBusiness Logic
Domain Layere.g. User, Book, ...
Business logic
Persistency Layer
User
Application Layere.g. LibraryAppBusiness logic
Thin Presentation LayerNo Business Logic
![Page 27: Software Engineering I (02161) · Software Engineering I (02161) Week 3 Assoc. Prof. Hubert Baumeister DTU Compute Technical University of Denmark Spring 2018. Contents Systematic](https://reader034.vdocuments.net/reader034/viewer/2022050218/5f63ffbe9d07ef73c34db03c/html5/thumbnails/27.jpg)
Coverage with EclEmma
![Page 28: Software Engineering I (02161) · Software Engineering I (02161) Week 3 Assoc. Prof. Hubert Baumeister DTU Compute Technical University of Denmark Spring 2018. Contents Systematic](https://reader034.vdocuments.net/reader034/viewer/2022050218/5f63ffbe9d07ef73c34db03c/html5/thumbnails/28.jpg)
Coverage with EclEmma
![Page 29: Software Engineering I (02161) · Software Engineering I (02161) Week 3 Assoc. Prof. Hubert Baumeister DTU Compute Technical University of Denmark Spring 2018. Contents Systematic](https://reader034.vdocuments.net/reader034/viewer/2022050218/5f63ffbe9d07ef73c34db03c/html5/thumbnails/29.jpg)
Coverage with EclEmma
![Page 30: Software Engineering I (02161) · Software Engineering I (02161) Week 3 Assoc. Prof. Hubert Baumeister DTU Compute Technical University of Denmark Spring 2018. Contents Systematic](https://reader034.vdocuments.net/reader034/viewer/2022050218/5f63ffbe9d07ef73c34db03c/html5/thumbnails/30.jpg)
Contents
Systematic tests
Code coverage
RefactoringRefactoringRefactoring Example
![Page 31: Software Engineering I (02161) · Software Engineering I (02161) Week 3 Assoc. Prof. Hubert Baumeister DTU Compute Technical University of Denmark Spring 2018. Contents Systematic](https://reader034.vdocuments.net/reader034/viewer/2022050218/5f63ffbe9d07ef73c34db03c/html5/thumbnails/31.jpg)
Refactoring and TDD
I restructure the system without changing its functionalityI Goal: improve the designI Requires tests
![Page 32: Software Engineering I (02161) · Software Engineering I (02161) Week 3 Assoc. Prof. Hubert Baumeister DTU Compute Technical University of Denmark Spring 2018. Contents Systematic](https://reader034.vdocuments.net/reader034/viewer/2022050218/5f63ffbe9d07ef73c34db03c/html5/thumbnails/32.jpg)
Refactoring
I PhD thesis by William Opdyke (1992)I Refactoring: Improving the Design of Existing Code, Martin
Fowler, 1999I Set of refactorings
I e.g. renameMethod, extractMethod, encapsulateField,encapsulateCollection, . . .
I Set of code smellsI e.g. Duplicate Code, Long Method, Large Class, . . .
![Page 33: Software Engineering I (02161) · Software Engineering I (02161) Week 3 Assoc. Prof. Hubert Baumeister DTU Compute Technical University of Denmark Spring 2018. Contents Systematic](https://reader034.vdocuments.net/reader034/viewer/2022050218/5f63ffbe9d07ef73c34db03c/html5/thumbnails/33.jpg)
Example of Code smells
If it stinks, change it Refactoring, Martin Fowler, 1999
I Duplicate CodeI Long MethodI Large Class (God class)I Switch StatementsI CommentsI . . .
http://en.wikipedia.org/wiki/Code_smell
![Page 34: Software Engineering I (02161) · Software Engineering I (02161) Week 3 Assoc. Prof. Hubert Baumeister DTU Compute Technical University of Denmark Spring 2018. Contents Systematic](https://reader034.vdocuments.net/reader034/viewer/2022050218/5f63ffbe9d07ef73c34db03c/html5/thumbnails/34.jpg)
Code Smell: Switch Statementpublic class User {
public double computeFine() {double fine = 0;for (Media m : borrowedMedia) {
if (m.overdue) {switch (m.getType()) {
case Media.BOOK : fine = fine + 10; break;case Media.DVD: fine = fine + 30; break;case Media.CD: fine = fine + 20; break;default fine = fine + 5; break;
}}
}return fine;
}}
User
...
computeFine
Medium
...type
1..5borrowedMedia
![Page 35: Software Engineering I (02161) · Software Engineering I (02161) Week 3 Assoc. Prof. Hubert Baumeister DTU Compute Technical University of Denmark Spring 2018. Contents Systematic](https://reader034.vdocuments.net/reader034/viewer/2022050218/5f63ffbe9d07ef73c34db03c/html5/thumbnails/35.jpg)
Better Design
public class User {public double computeFine() {
double fine = 0;for (Media m : borrowedMedia) {
if (m.overdue) { fine = fine + m.getFine();}}return fine;
}}
abstract public class Media {abstract public double getFine();
}
public class Book extends Media {public double getFine() { return 10; }
}
public class DVD extends Media {public double getFine() { return 30; }
}
public class CD extends Media {public double getFine() { return 20; }
}
DVD
...
getFine
Book
...
getFine
CD
...
getFine
User
...
computeFine
Medium
...
getFine1..5
borrowedMedia
![Page 36: Software Engineering I (02161) · Software Engineering I (02161) Week 3 Assoc. Prof. Hubert Baumeister DTU Compute Technical University of Denmark Spring 2018. Contents Systematic](https://reader034.vdocuments.net/reader034/viewer/2022050218/5f63ffbe9d07ef73c34db03c/html5/thumbnails/36.jpg)
Eclipse Refactoring Support
I Menu in the code editorI Different menus depending on selection
I ImportantI Very small steps even for complex refactorings: StrategyI Each step from green to green
![Page 37: Software Engineering I (02161) · Software Engineering I (02161) Week 3 Assoc. Prof. Hubert Baumeister DTU Compute Technical University of Denmark Spring 2018. Contents Systematic](https://reader034.vdocuments.net/reader034/viewer/2022050218/5f63ffbe9d07ef73c34db03c/html5/thumbnails/37.jpg)
MarriageAgency class diagram
MarriageAgency
matchCustomer(Customer c)
Customer
sex [1]birthYear [1]interests [*]*
I Refactoring example in detail→ http://www2.imm.dtu.dk/courses/02161/2018/
slides/refactoring_example.pdf
I Framework for running tests as soon as the code changes:→ Infinitest http://infinitest.github.io/
![Page 38: Software Engineering I (02161) · Software Engineering I (02161) Week 3 Assoc. Prof. Hubert Baumeister DTU Compute Technical University of Denmark Spring 2018. Contents Systematic](https://reader034.vdocuments.net/reader034/viewer/2022050218/5f63ffbe9d07ef73c34db03c/html5/thumbnails/38.jpg)
Remark on refactoring
MarriageAgency
matchCustomer(Customer c)
Customer
sex [1]birthYear [1]interests [*]
hasOneInterestInCommon(Customer c)hasOppositeSex(Customer c)hasAppropriateAge(Customer c)match(Customer c)
*
I Always green to greenI Decompose a large refactoring into small refactorings
→ No failing tests for too long (e.g. hours, days, weeks, . . . )I Ideally, refactorings can be interrupted