testing in netbeans. swc testing the ideal test: when the test is passed, the product is ready for...

35
Testing in NetBeans

Upload: derrick-day

Post on 02-Jan-2016

215 views

Category:

Documents


0 download

TRANSCRIPT

Testing in NetBeans

SWC

Testing

• The ideal test:• When the test is passed, the product is ready

for delivery!• Ideal – but (almost) impossible

– Number of test cases is often very large– How does one test a GUI?– Is functional correctness all that matters?

SWC

Unit testing• A Unit Test is aimed at testing a well-defined

code module, in Java usually a single class• Unit tests are at the functional level

– Define test cases in terms of input to class methods (public and private)

– Define the expected output for each case– Run the test– Compare expected and actual output

SWC

Unit testing

• NetBeans can create a unit test framework (or ”test harness”) for a project

• Relies on a Java framework called JUnit (see www.junit.org)

• We also used JUnit in BlueJ

SWC

Unit testing in NetBeans

• Consider our ”classic” BankAccount class, with three methods:– deposit– withdraw– getbalance

• Having created the class, we can now create a unit test for the class

SWC

Unit testing in NetBeans

SWC

Unit testing in NetBeans

SWC

Unit testing in NetBeans

SWC

Unit testing in NetBeans

• There are quite a lot of options to choose from when generating a test class…

• For now, just leave them as-is• When pressing Finish, a unit test class is

generated for us, called BankAccountTest (just choose ”Junit 4.x”)

• The test class is placed under Test Packages

SWC

Unit testing in NetBeans

• The generated test class does look a bit complex (remember we chose all options)

• However, we are free to edit it!• Remove whatever you do not need• NetBeans can only generate a ”skeleton” for

the test class – we must complete it

SWC

Unit testing in NetBeans@BeforeClass

public static void setUpClass() throws Exception {

}

@AfterClass

public static void tearDownClass() throws Exception {

}

SWC

Unit testing in NetBeans

• The two methods setUpClass and tearDownclass allows us to include any actions needed before and after running all the test class methods, respectively– Dependencies to other classes– Database connection– Etc.

• Is often not used – then delete it!

SWC

Unit testing in NetBeans

@Before

public void setUp() {

}

@After

public void tearDown() {

}

SWC

Unit testing in NetBeans

• The two methods setUp and tearDown allows us to include any actions needed before and after running each of the test class methods, respectively– Initialising/resetting variable values– Cleaning up data structures– Etc.

• Is often not used – then delete it!

SWC

Unit testing in NetBeans@Test

public void testGetBalance()

{

System.out.println("getBalance");

BankAccount instance = new BankAccount();

int expResult = 0;

int result = instance.getBalance();

assertEquals(expResult, result);

// TODO review the generated test code and

// remove the default call to fail.

fail("The test case is a prototype.");

}

SWC

Unit testing in NetBeans

• Notice that a test method does not return a value (true/false)

• Instead, so-called assertions are used during the test

• An assertion can succeed or fail• A failed assertion throws an exception, and

the test case is considered failed

SWC

Unit testing in NetBeans

• Examples of assertions:– assertEquals(expectedValue, ActualValue)

– assertTrue(condition)– assertFalse(condition)– assertNotNull(object)– assertNull(object)– assertSame(object, object)– assertNotSame(object, object)– fail() // ALWAYS fails

SWC

Unit testing in NetBeans

• If you inspect the generated test code, you will find that it is not very useful

• We must – almost always – implement the body of the test methods ourselves

• We are free to add more test methods than those initially generated – the test framework will run them automatically

SWC

Unit testing in NetBeans

• Once the test methods have been defined properly, we can run the test

• Choose Run | Test Project, or just press Alt + F6

• Result of test is displayed in the output window, with indicative colors

SWC

Unit testing in NetBeans

SWC

Unit testing in NetBeans

SWC

Unit testing considerations

• In the ideal scenario, all units tests should be completely self-contained

• Testing of a particular class should not depend on other classes

• Testing of a particular method should not depend on other methods

• Isolates cause of failed tests

SWC

Unit testing considerations@Test

public void testDeposit()

{

int b = theAcc.getBalance();

theAcc.deposit(500);

int a = theAcc.getBalance();

int diff = a – b;

assertEquals(diff, 500);

}

SWC

Unit testing considerations

• Suppose now that testDeposit fails

• Which method in BankAccount contains an error…?

• Is it deposit, or getBalance...?

You are wrong!

No, you are wrong!

SWC

Unit testing considerations@test

public void testCubeVolume()

{

int volume = theCube.getVolume();

int expVolume = theMathLib.calcCube(theCube.getSide());

assertEquals(volume, expVolume);

}

Cube

getSidegetVolume

MathLibrary

calcCube…

SWC

Unit testing considerations

• Suppose now that testCubeVolume fails

• Which class contains an error…?

• Is it Cube or MathLibrary…?

You are wrong, again!

No, you are wrong again!

SWC

Unit testing considerations

• Testing one functionality often assumes that some other functionality already works correctly…

• This is quite hard to avoid in practice• A rigorous approach is to use so-called test

stubs

SWC

Unit testing considerations

• A test stub is a ”simulation” of the behavior of a real class or method

• (Martin Fowler): Test stubs provide canned answers to calls made during the test, usually not responding at all to anything outside what's programmed in for the test

SWC

Unit testing considerations

• Making a test stub– Write the test, calling any external methods that

are needed– Substitute all calls to external methods with calls

to stub methods (Proxy…?)– Implement the stubs as returning the desired

answer without any calculation

SWC

Unit testing considerations@Test

public void testCubeVolume()

{

int volume = theCube.getVolume();

int expVolume = theMathLibStub.calcCube(theCube.getSide());

assertEquals(volume, expVolume);

}

...

// Code in MathLibraryStub

// Only called with input = 8 in test

public int calcCube(int input)

{

return 512;

}

SWC

Unit testing considerations• Creating a test using stubs consequently can

be done – but is quite labor-intensive• More pragmatic approach is to use a bottom-

up approach– Test basic methods/classes first (methods/classes that do

not use other methods/classes)– When basic methods/classes work, test methods/classes

that only use basic methods/classes– And so on (dependency tree)

SWC

Testing – final remarks

• We can (almost) never expect to create a completely covering test

• Testing is about raising confidence in the correctness of the program

• Always a compromise between level of confidence and required effort

SWC

Testing – final remarks

Confidence

Effort

Studentassignment

Commer-cial word processor

Space Shuttle software

SWC

Testing – final remarks

• Further reading:• JUnit test in NetBeans

http://www.netbeans.org/kb/docs/java/junit-intro.html

• More about Junit in generalwww.junit.org

• …and the Net contains a lot of material about test in general!