2012-03-29 13 views
6

Mam test z 15-20 różnymi testami, chcę uruchomić ten sam test z dwukrotnie dwoma różnymi parametrami, które mają zostać przekazane do metody BeforeClass testu, na przykład:Uruchamianie dwóch tych samych testów z różnymi argumentami

public class TestOne { 
    private static ClassToTest classToTest; 

    @BeforeClass 
    public static void setUp() throws Exception { 
     classToTest = new ClassToTest("Argument1", "Argument2"); 
    } 

    @Test 
    public void testOne() { 
    ........roughly 15 - 20 tests here 
} 

public class TestTwo { 
    private static ClassToTest classToTest; 

    @BeforeClass 
    public static void setUp() throws Exception { 
     classToTest = new ClassToTest("Argument3", "Argument4"); 
    } 

    @Test 
    public void testOne() { 
    ........roughly 15 - 20 tests here, same as in TestOne 
} 

Jak widać jedyna różnica pomiędzy tymi dwoma testami jest w metodzie setup, który przechodzi różne wartości do konstruktora ClassToTest. Nie chcę replikować metod testowych w obu klasach, ale wolałbym dziedziczenie lub inny inteligentny sposób osiągnięcia tego w jednej klasie.

+0

Proste dziedziczenie powinno działać poprawnie. Czy próbowałeś przenieść ClassToTest i testOne() do baseclass? – robertvoliva

Odpowiedz

6

Wydaje się to doskonałym przykładem użycia JUnit4's @Parameters; patrz https://blogs.oracle.com/jacobc/entry/parameterized_unit_tests_with_junit lub http://www.mkyong.com/unittest/junit-4-tutorial-6-parameterized-test/. Powiedział, że będziesz musiał przenieść inicjalizację z metody setUp do konstruktora dla klasy testowej.

+0

To nie jest dla mnie dobre, ponieważ chcemy tylko jednej instancji ClassToTest, jest to bardzo ciężki obiekt do stworzenia. Nie chcę, aby mój test trwał wiecznie. Mam na myśli jedno wystąpienie ClassToTest, współużytkowane przez wszystkie metody testowania, dlatego jest zdefiniowane w ** @ BeforeClass ** – Ravi

+0

Jeśli twoja klasa testowa jest naprawdę waga ciężka ... cóż, jest tam twój problem. Zniszcz testy, dopóki nie stracą wagi. –

+0

Nie mówię, że moja klasa testowa jest ciężka, klasa, którą próbuję przetestować, jest ciężka, ponieważ łączy się z zewnętrznym systemem, nie możemy nic z tym zrobić, w rzeczywistości ten test jest testem integracyjnym, aby zweryfikować, że otrzymujemy odpowiednie dane z tego systemu. – Ravi

0

Zgodnie z dokumentacją (http://docs.oracle.com/javase/tutorial/java/IandI/subclasses.html):

Podklasa nie dziedziczy prywatnych członków swojej klasie nadrzędnej . Jeśli jednak nadklasa ma publiczne lub chronione metody dostępu do jej prywatnych pól przez , mogą one być również używane przez podklasę.

0

Jak o tym:

public class TestOne { 
    private static ClassToTest classToTest1, classToTest2; 

    @BeforeClass 
    public static void setUp() throws Exception { 
     classToTest1 = new ClassToTest("Argument1", "Argument2"); 
     classToTest2 = new ClassToTest("Argument3", "Argument4"); 
    } 

    @Test 
    public void testOne() { 
     testOneImpl(classToTest1); 
     testOneImpl(classToTest2); 
    } 

    public void testOneImpl(ClassToTest classToTest) { 
     // exact samew as whatever your current testOne() test method is 
    } 

    .... 
} 

EDIT: Albo zachować metoda odliczanie:

public class TestOne { 
    private static List<ClassToTest> classesToTest; 

    @BeforeClass 
    public static void setUp() throws Exception { 
     classesToTest = new ArrayList<>; 
     classesToTest.add(new ClassToTest("Argument1", "Argument2")); 
     classesToTest.add(new ClassToTest("Argument3", "Argument4")); 
    } 

    @Test 
    public void testOne() { 
     for (ClassToTest classToTest: classesToTest) { 
      ... same test content as before 
     } 
    } 
+0

Pamiętaj, że mamy około 20 testów, więc 20 razy * 2 metody, będą musiały być napisane – Ravi

+0

Doszedłem do wniosku, że twoja troska dotyczyła duplikowania kodu, a nie liczby metod. W ten sposób nie dochodzi do powielania kodu, zwięzłego wyrażania zamiarów, rozdzielania wątpliwości itp. Czy naprawdę jest to uciążliwe, aby dodać kolejną * bardzo krótką * metodę standardową dla każdej metody testowej?Oczywiście możesz przetestować listę "classToTest1" i "classToTest2" w każdej metodzie testu, jeśli chcesz zachować odliczanie metod, a listę można zdefiniować raz w 'setUp'. –

1

Na co warto, oto jak można to zrobić z TestNG:

public class TestFactory { 
    @Factory 
    public Object[] createTests() { 
    return new Object[] { 
     new ClassToTest("arg1", "arg2"), 
     new ClassToTest("arg3", "arg4") 
    }; 
    } 
} 

public class ClassToTest { 
    public ClassToTest(String arg1, String arg2) { 
    this.arg1 = arg1; 
    this.arg2 = arg2; 
    } 

    @Test 
    public void testOne() { 
    // use arg1 and arg2 
    } 
} 
1

Dziękuję wszystkim za Twój q Odpowiedzi uick. To jak to zrobiłem w końcu

public abstract class Base { 
    final HeavyObject heavy; 

    protected Base(HeavyObject heavy) { 
     this.param = param; 
    } 

    @Test 
    public void test() { 
     param.doSomething(); 
    } 

    @Test 
    .............More tests here 

} 


public class FirstTest extends Base{ 

    private static HeavyObject param; 

    @BeforeClass 
    public static void init() { 
     param = new HeavyObject("arg1", "arg2"); 
    } 

    public FirstTest() { 
     super(param); 
    } 
} 

public class SecondTest extends Base{ 

    private static HeavyObject param; 

    @BeforeClass 
    public static void init() { 
     param = new HeavyObject("arg3", "arg4"); 
    } 

    public FirstTest() { 
     super(param); 
    } 
} 

zasadą jest klasa abstrakcyjna, która posiada wszystkie testy i FirstTest i SecondTest tworzenie własnych obiektów z różnymi parametrami i przekazać je do klasy abstrakcyjnej, aby go używać.

Powiązane problemy