Testing in Netbeans

entomologistsamoanSoftware and s/w Development

Aug 15, 2012 (4 years and 11 months ago)

465 views

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

Testing

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


getSide

getVolume

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

Student

assignment

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 general


www.junit.org


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