Чи є спосіб сказати JUnit запускати певний тестовий приклад кілька разів з різними даними безперервно перед переходом до наступного тестового випадку?
Чи є спосіб сказати JUnit запускати певний тестовий приклад кілька разів з різними даними безперервно перед переходом до наступного тестового випадку?
Відповіді:
погляньмо на теорію junit 4.4 :
import org.junit.Test;
import org.junit.experimental.theories.*;
import org.junit.runner.RunWith;
@RunWith(Theories.class)
public class PrimeTest {
@Theory
public void isPrime(int candidate) {
// called with candidate=1, candidate=2, etc etc
}
public static @DataPoints int[] candidates = {1, 2, 3, 4, 5};
}
Здається, це ідеальний кандидат для параметризованих тестів.
Але в основному параметризовані тести дозволяють запускати один і той же набір тестів на різних даних.
Ось кілька хороших дописів про це в блозі:
Нещодавно я розпочав проект zohhak . Це дозволяє писати:
@TestWith({
"25 USD, 7",
"38 GBP, 2",
"null, 0"
})
public void testMethod(Money money, int anotherParameter) {
...
}
,
- якщо це суперечить вашим тестовим даним, ви можете змінити роздільник, вказавши його явно, тобто@TestWith({"25 USD# 0"}, separator = "#")
Набагато кращий спосіб (дозволяє використовувати більше одного методу тестування) - це використовувати JUnit з JUnitParams:
import junitparams.Parameters;
import org.junit.Test;
@RunWith(JUnitParamsRunner.class)
Public class TestClass() {
@Test
@Parameters(method = "generateTestData")
public void test1(int value, String text, MyObject myObject) {
... Test Code ...
}
.... Other @Test methods ....
Object[] generateTestData() {
MyObject objectA1 = new MyObject();
MyObject objectA2 = new MyObject();
MyObject objectA3 = new MyObject();
return $(
$(400, "First test text.", objectA1),
$(402, "Second test text.", objectA2),
$(403, "Third test text.", objectA3)
);
}
}
Ви можете отримати проект junitparams тут .
Ось допис, який я написав, який показує кілька способів повторного запуску тестів із прикладами коду:
Ви можете використати @Parametrized runner або використовувати спеціальний бігун, включений у публікацію
Якщо ви вже використовуєте a @RunWith
у своєму тестовому класі, вам, мабуть, потрібно поглянути на це .
Я завжди просто створюю допоміжний метод, який виконує тест на основі параметрів, а потім викликаю цей метод із методу тестування JUnit. Зазвичай це означало б, що один метод тестування JUnit насправді виконував би багато тестів, але для мене це не було проблемою. Якщо вам потрібні кілька методів тестування, по одному для кожного окремого виклику, я рекомендую створити клас тесту.
Якщо ви не хочете або не можете використовувати власний бігун (наприклад, ви вже використовуєте інший бігун, наприклад Robolectric runner), ви можете спробувати це правило DataSet .