laboratory unit testing · junit is a java-based toolkit for writing executable tests. choose a...
TRANSCRIPT
![Page 1: Laboratory Unit Testing · JUnit is a Java-based toolkit for writing executable tests. Choose a target from the code base. Write a “testing class” containing a series of unit](https://reader034.vdocuments.us/reader034/viewer/2022042606/5f955fdadb82c733134154d1/html5/thumbnails/1.jpg)
Unit Testing LaboratoryCSCE 747 - Lecture 18 - 03/17/2016
![Page 2: Laboratory Unit Testing · JUnit is a Java-based toolkit for writing executable tests. Choose a target from the code base. Write a “testing class” containing a series of unit](https://reader034.vdocuments.us/reader034/viewer/2022042606/5f955fdadb82c733134154d1/html5/thumbnails/2.jpg)
Today’s Class
● We’ve covered many testing techniques.● We’ve covered the basics of writing
executable test cases.● Today - we put those lessons into practice.
○ We will work together to test a sample system.
Gregory Gay CSCE 747 - Spring 2016 2
![Page 3: Laboratory Unit Testing · JUnit is a Java-based toolkit for writing executable tests. Choose a target from the code base. Write a “testing class” containing a series of unit](https://reader034.vdocuments.us/reader034/viewer/2022042606/5f955fdadb82c733134154d1/html5/thumbnails/3.jpg)
Enter… The Planning System
● Everybody likes meetings.○ Not true - but we
need to book them.● We don’t want to
double-book rooms or employees for meetings.
● System to manage schedules and meetings.
Gregory Gay CSCE 747 - Spring 2016 3
![Page 4: Laboratory Unit Testing · JUnit is a Java-based toolkit for writing executable tests. Choose a target from the code base. Write a “testing class” containing a series of unit](https://reader034.vdocuments.us/reader034/viewer/2022042606/5f955fdadb82c733134154d1/html5/thumbnails/4.jpg)
The Planning System
Offers the following high-level features:1. Booking a meeting2. Booking vacation time3. Checking availability for a room4. Checking availability for a person5. Printing the agenda for a room6. Printing the agenda for a person
Gregory Gay CSCE 747 - Spring 2016 4
![Page 5: Laboratory Unit Testing · JUnit is a Java-based toolkit for writing executable tests. Choose a target from the code base. Write a “testing class” containing a series of unit](https://reader034.vdocuments.us/reader034/viewer/2022042606/5f955fdadb82c733134154d1/html5/thumbnails/5.jpg)
Your Task
In groups, come up with a test plan for this system.● Given the above features and the code
documentation, plan out a series of test cases to ensure that these features can be performed without error.
Gregory Gay CSCE 747 - Spring 2016 5
![Page 6: Laboratory Unit Testing · JUnit is a Java-based toolkit for writing executable tests. Choose a target from the code base. Write a “testing class” containing a series of unit](https://reader034.vdocuments.us/reader034/viewer/2022042606/5f955fdadb82c733134154d1/html5/thumbnails/6.jpg)
Food for Thought
● What are the “testable units”?○ Your tests may use any of the classes in the system,
and may be at the method, class, or system level.● Think about both normal execution and
illegal inputs/actions.○ How many things can go wrong? ○ You will probably be able to add a normal meeting,
but can you add a meeting for February 35th? ○ Try it out - you have the code.
Gregory Gay CSCE 747 - Spring 2016 6
![Page 7: Laboratory Unit Testing · JUnit is a Java-based toolkit for writing executable tests. Choose a target from the code base. Write a “testing class” containing a series of unit](https://reader034.vdocuments.us/reader034/viewer/2022042606/5f955fdadb82c733134154d1/html5/thumbnails/7.jpg)
Unit Testing
![Page 8: Laboratory Unit Testing · JUnit is a Java-based toolkit for writing executable tests. Choose a target from the code base. Write a “testing class” containing a series of unit](https://reader034.vdocuments.us/reader034/viewer/2022042606/5f955fdadb82c733134154d1/html5/thumbnails/8.jpg)
Writing a Unit Test
JUnit is a Java-based toolkit for writing executable tests. ● Choose a target from
the code base.● Write a “testing class”
containing a series of unit tests centered around testing that target.
public class Calculator {
public int evaluate (String
expression) {
int sum = 0;
for (String summand:
expression.split("\\+"))
sum += Integer.valueOf(summand);
return sum;
}
}
Gregory Gay CSCE 747 - Spring 2016 8
![Page 9: Laboratory Unit Testing · JUnit is a Java-based toolkit for writing executable tests. Choose a target from the code base. Write a “testing class” containing a series of unit](https://reader034.vdocuments.us/reader034/viewer/2022042606/5f955fdadb82c733134154d1/html5/thumbnails/9.jpg)
Writing a Unit Test
public class Calculator {
public int evaluate (String
expression) {
int sum = 0;
for (String summand:
expression.split("\\+"))
sum += Integer.valueOf(summand);
return sum;
}
}
import static org.junit.Assert.
assertEquals;
import org.junit.Test;
public class CalculatorTest {
@Test
public void evaluatesExpression() {
Calculator calculator =
new Calculator();
int sum =
calculator.evaluate("1+2+3");
assertEquals(6, sum);
calculator = null;
}
}
Gregory Gay CSCE 747 - Spring 2016 9
Convention - name the test class after the class it is testing or the functionality being tested.
Each test is denoted with keyword @test.
Initialization
Test Steps
Input
Oracle
Tear Down
![Page 10: Laboratory Unit Testing · JUnit is a Java-based toolkit for writing executable tests. Choose a target from the code base. Write a “testing class” containing a series of unit](https://reader034.vdocuments.us/reader034/viewer/2022042606/5f955fdadb82c733134154d1/html5/thumbnails/10.jpg)
Test Fixtures - Shared Initialization
@Before annotation defines a common testinitialization method:
@Before
public void setUp() throws Exception
{
this.registration = new Registration();
this.registration.setUser(“ggay”);
}
Gregory Gay CSCE 747 - Spring 2016 10
![Page 11: Laboratory Unit Testing · JUnit is a Java-based toolkit for writing executable tests. Choose a target from the code base. Write a “testing class” containing a series of unit](https://reader034.vdocuments.us/reader034/viewer/2022042606/5f955fdadb82c733134154d1/html5/thumbnails/11.jpg)
Test Fixtures - Teardown Method
@After annotation defines a common test teardown method:
@After
public void tearDown() throws Exception
{
this.registration.logout();
this.registration = null;
}
Gregory Gay CSCE 747 - Spring 2016 11
![Page 12: Laboratory Unit Testing · JUnit is a Java-based toolkit for writing executable tests. Choose a target from the code base. Write a “testing class” containing a series of unit](https://reader034.vdocuments.us/reader034/viewer/2022042606/5f955fdadb82c733134154d1/html5/thumbnails/12.jpg)
Test Skeleton
@Test annotation defines a single test:
@Test
public void test<MethodName><TestingContext>() {
//Define Inputs
try{ //Try to get output.
}catch(Exception error){
fail("Why did it fail?");
}
//Compare expected and actual values through assertions or through if statements/fails
}
Gregory Gay CSCE 747 - Spring 2016 12
![Page 13: Laboratory Unit Testing · JUnit is a Java-based toolkit for writing executable tests. Choose a target from the code base. Write a “testing class” containing a series of unit](https://reader034.vdocuments.us/reader034/viewer/2022042606/5f955fdadb82c733134154d1/html5/thumbnails/13.jpg)
Assertions
Assertions are a "language" of testing - constraints that you place on the output.
● assertEquals, assertArrayEquals● assertFalse, assertTrue● assertNull, assertNotNull● assertSame,assertNotSame● assertThat
Gregory Gay CSCE 747 - Spring 2016 13
![Page 14: Laboratory Unit Testing · JUnit is a Java-based toolkit for writing executable tests. Choose a target from the code base. Write a “testing class” containing a series of unit](https://reader034.vdocuments.us/reader034/viewer/2022042606/5f955fdadb82c733134154d1/html5/thumbnails/14.jpg)
Testing Exceptions
● When testing error handling, we expect exceptions to be thrown.
● In JUnit, we can ensure that the right exception is thrown.
@Test(expected = IndexOutOfBoundsException.class)
public void empty() {
new ArrayList<Object>().get(0);
}
Gregory Gay CSCE 747 - Spring 2016 14
![Page 15: Laboratory Unit Testing · JUnit is a Java-based toolkit for writing executable tests. Choose a target from the code base. Write a “testing class” containing a series of unit](https://reader034.vdocuments.us/reader034/viewer/2022042606/5f955fdadb82c733134154d1/html5/thumbnails/15.jpg)
Your Task
● Translate planned tests into executable jUnit tests.○ If a test is supposed to cause an exception to be
thrown. Make sure you check for that exception.○ Make sure that your expected output is detailed
enough to ensure that - if something is supposed to fail - that it fails for the correct reasons.
Gregory Gay CSCE 747 - Spring 2016 15
![Page 16: Laboratory Unit Testing · JUnit is a Java-based toolkit for writing executable tests. Choose a target from the code base. Write a “testing class” containing a series of unit](https://reader034.vdocuments.us/reader034/viewer/2022042606/5f955fdadb82c733134154d1/html5/thumbnails/16.jpg)
Finding Faults
![Page 17: Laboratory Unit Testing · JUnit is a Java-based toolkit for writing executable tests. Choose a target from the code base. Write a “testing class” containing a series of unit](https://reader034.vdocuments.us/reader034/viewer/2022042606/5f955fdadb82c733134154d1/html5/thumbnails/17.jpg)
Did You Find the Faults?
1: getMeeting and removeMeeting perform no error checking on dates.
public Meeting getMeeting(int month, int day, int index){
return occupied.get(month).get(day).get(index);
}
public void removeMeeting(int month, int day, int index){
occupied.get(month).get(day).remove(index);
}
Gregory Gay CSCE 747 - Spring 2016 17
![Page 18: Laboratory Unit Testing · JUnit is a Java-based toolkit for writing executable tests. Choose a target from the code base. Write a “testing class” containing a series of unit](https://reader034.vdocuments.us/reader034/viewer/2022042606/5f955fdadb82c733134154d1/html5/thumbnails/18.jpg)
Did You Find the Faults?
2: Calendar has a 13th month.public Calendar(){
occupied = new
ArrayList<ArrayList<ArrayList<Meeting>>>();
for(int i=0;i<=13;i++){
// Initialize month
occupied.add(new ArrayList<ArrayList<Meeting>>());
for(int j=0;j<32;j++){
// Initialize days
occupied.get(i).add(new ArrayList<Meeting>());
}
}
Gregory Gay CSCE 747 - Spring 2016 18
![Page 19: Laboratory Unit Testing · JUnit is a Java-based toolkit for writing executable tests. Choose a target from the code base. Write a “testing class” containing a series of unit](https://reader034.vdocuments.us/reader034/viewer/2022042606/5f955fdadb82c733134154d1/html5/thumbnails/19.jpg)
Did You Find the Faults?
3: November has 30 days.Oh - and we just added a meeting to a day with a date that does not match that date.
occupied.get(11).get(30).add(new Meeting(11,31,"Day does not
exist"));
Gregory Gay CSCE 747 - Spring 2016 19
![Page 20: Laboratory Unit Testing · JUnit is a Java-based toolkit for writing executable tests. Choose a target from the code base. Write a “testing class” containing a series of unit](https://reader034.vdocuments.us/reader034/viewer/2022042606/5f955fdadb82c733134154d1/html5/thumbnails/20.jpg)
Did You Find the Faults?
4: Used a >= in checking for illegal times. December no longer exists.if(mMonth < 1 || mMonth >= 12){
throw new TimeConflictException("Month does not
exist.");
}
Gregory Gay CSCE 747 - Spring 2016 20
![Page 21: Laboratory Unit Testing · JUnit is a Java-based toolkit for writing executable tests. Choose a target from the code base. Write a “testing class” containing a series of unit](https://reader034.vdocuments.us/reader034/viewer/2022042606/5f955fdadb82c733134154d1/html5/thumbnails/21.jpg)
Did You Find the Faults?
5: We should be able to start and end a meeting in the same hour.if(mStart >= mEnd){
throw new TimeConflictException("Meeting starts before it
ends.");
}
Gregory Gay CSCE 747 - Spring 2016 21
![Page 22: Laboratory Unit Testing · JUnit is a Java-based toolkit for writing executable tests. Choose a target from the code base. Write a “testing class” containing a series of unit](https://reader034.vdocuments.us/reader034/viewer/2022042606/5f955fdadb82c733134154d1/html5/thumbnails/22.jpg)
What Other Faults Did You Find?
![Page 23: Laboratory Unit Testing · JUnit is a Java-based toolkit for writing executable tests. Choose a target from the code base. Write a “testing class” containing a series of unit](https://reader034.vdocuments.us/reader034/viewer/2022042606/5f955fdadb82c733134154d1/html5/thumbnails/23.jpg)
Code Coverage
● What level of coverage did our tests achieve over the system?
● How can we cover the gaps?
Gregory Gay CSCE 747 - Spring 2016 23
![Page 24: Laboratory Unit Testing · JUnit is a Java-based toolkit for writing executable tests. Choose a target from the code base. Write a “testing class” containing a series of unit](https://reader034.vdocuments.us/reader034/viewer/2022042606/5f955fdadb82c733134154d1/html5/thumbnails/24.jpg)
Next Time
● Fault-Based Testing○ Using ideas about what could go wrong to guide
testing.○ Related reading - Chapter 16
● Homework 3 - due tonight.● Reading assignment 4 - due next week.
Gregory Gay CSCE 747 - Spring 2016 24