JUnit 4 - användning Grunderna Henrik Bergström DSV SU/KTH org.junit org.junit.test Innehåller bland annat: Test Assert Obs! Inte ett paket annotation som berättar att den efterföljande metoden är ett testfall
org.junit.assert Ett enkelt exempel Obs! Inte ett paket Innehåller statiska metoder för att kontrollera om test lyckas Importeras ofta statiskt Köra i Eclipse Testfallen hålls separat
Skapa ett testfall Inställningar JUnit 4 Inställningar Inställningar JUnit 4 Source folder JUnit 4 Source folder Package
Inställningar Inställningar JUnit 4 Source folder Package Namn JUnit 4 Source folder Package Namn Hjälpmetoder Inställningar Skelett JUnit 4 Source folder Package Namn Hjälpmetoder Skelett public void testsetday() { fail("not yet implemented");
Den tomma testklassen De viktigaste import-satserna public class DateTester { import static org.junit.assert.*; import org.junit.test; public class DateTester { Ett par testfall Att köra testfallen public void year() { Date d = new Date(); assertequals(2008, d.getyear()); public void month() { Date d = new Date(); assertequals(1, d.getmonth());
Resultatet Köra manuellt $> javac -classpath src:test:junit-4.4.jar test/datetester.java? http://junit.sourceforge.net/doc/faq/faq.htm#tests_1 public static void main(string args[]) { org.junit.runner.junitcore.main("datetester"); java -classpath src:test:junit-4.4.jar org.junit.runner.junitcore DateTester Testsviter Fler testfall import static org.junit.assert.*; import org.junit.test; public class MoreTests { public void leapyear() { Date d = new Date(2008, 1, 1); assertequals(true, d.isleapyear());
En testsvit Mer om Assert import org.junit.runner.runwith; import org.junit.runners.suite; import org.junit.runners.suite.suiteclasses; @RunWith(value = Suite.class) @SuiteClasses(value = { DateTester.class, MoreTests.class ) public class AllTests { assertequals assertequals(true, d.isleapyear()); Ett problem assertequals(1, 1L); assertequals("felmeddelande", true, d.isleapyear());
Ett problem till (och ett felaktigt testfall) Korrekt lösning (dock fortfarande ett felaktigt testfall) public void fraction() { Date d = new Date(2008, 12, 31); public void fraction2() { Date d = new Date(2008, 12, 31); assertequals(1.4, d.fractionofyear()); assertequals(1.4, d.fractionofyear(), 0.001); asserttrue & assertfalse assertarrayequals int x=5; asserttrue(x<10); assertfalse(x==10); String[] a1 = {"ABC", "BAC"; String[] a2 = {"ABC", "BAC"; assertarrayequals(a1, a2);
assertnull & assertnotnull assertsame & assertnotsame assertnull(o); assertnotnull(o); assertsame(o1, o2); assertnotsame(o1, o2); fail assertthat (nytt från 4.4) fail(); public void testsetday() { fail("not yet implemented"); import static org.hamcrest.corematchers.*; import static org.junit.matchers.junitmatchers.*; public void newassertvariants(){ Date d = new Date(2000, 1, 1); assertthat(d.getyear(), is(2000));
Assumptions (nytt från 4.4) public void assumptions(){ Date d = new Date(2000, 2, 1); assumethat(d.isleapyear(), is(true)); assumetrue public void assumptions2(){ Date d = new Date(2000, 2, 1); assumetrue(d.isleapyear()); assertthat(d.daysinmonth(), is(29)); assertequals(d.daysinmonth(), 29); assertthat(d.daysinmonth(), is(29)); Att sätta upp testmiljön @Before private Date d; @Before public void setup() throws Exception { d=new Date(2008,12,31); public void year() { assertequals(2008, d.getyear());
@After @BeforeClass @After public void teardown() throws Exception {... private static Date d; @BeforeClass public static void setupbeforeclass() throws Exception { d = new Date(2008, 12, 31); @AfterClass Spridda nyttigheter @AfterClass public static void teardownafterclass() throws Exception {...
Undantag: det gamla sättet Undantag: det nya sättet public void exceptionold(){ try{ Date d = new Date(2008, 1, 365); fail(); // Obs viktigt! catch(illegaldateexception e){ (expected=illegaldateexception.class) public void exceptionnew(){ Date d = new Date(2008, 1, 365); Timeout Tillfälligt plocka bort test (timeout=1000) public void longtest(){ // Operation som eventuellt // kan ta tid @Ignore("Testet ignoreras därför att...") public void ignoredtest(){
Flera väldigt lika test Loop-varianten public void testisleapyear() { int[] testyears = { 2000, 4000 ; for (int year : testyears) { Date d = new Date(year, 1, 1); asserttrue("år " + year + " är ett skottår", d.isleapyear()); Parameter-varianten Testfallet @RunWith(value = Parameterized.class) public class ParamLeapYearTester { private int year; public ParamLeapYearTester(int y) { year = y; public void testisleapyear() { Date d = new Date(year, 1, 1); asserttrue("år " + year + " är ett skottår", d.isleapyear());
Parametrarna @Parameters public static Collection leapyearstotest(){ return Arrays.asList( new Integer[][] { { 2000, { 4000 ); Flera paramerar @Parameters public static Collection leapyearstotest(){ return Arrays.asList( new Integer[][] { { 2000, 1, 1, { 4000, 1, 1 ); @Theory (nytt från 4.4) @DataPoint @Theory public void isleapyear(int year) { Date d = new Date(year, 1, 1); assumetrue(year<=2000); asserttrue(d.isleapyear()); @DataPoint public static final int NORMAL_LEAP_YEAR = 1996; @DataPoint public static final int SPECIAL_LEAP_YEAR = 2000; @DataPoint public static final int FUTURE_LEAP_YEAR = 4000;
Kompatibla data RunWith @DataPoint public static final String text = "test"; import static org.junit.assert.*; import org.junit.test; import org.junit.runner.runwith; import org.junit.experimental.theories.datapoint; import org.junit.experimental.theories.theories; import org.junit.experimental.theories.theory; @RunWith(Theories.class) public class JUnit4_4FeaturesPart2 { @Theory eller public void isleapyear2(int year) { Date d = new Date(year, 1, 1); asserttrue(d.isleapyear());