Запуск одного і того ж тесту JUnit кілька разів з різними даними


77

Чи є спосіб сказати JUnit запускати певний тестовий приклад кілька разів з різними даними безперервно перед переходом до наступного тестового випадку?


6
Використовуючи теорії (на що вказує @dfa), Junit буде розглядати всі тести як один тест і ускладнить з’ясування того, який тест провалився. Тоді як параметризовані тести (як зазначив @ jjnguy) розглядають їх як різні тести, чітко вказуючи, який тест не вдався.
читач розумів

Відповіді:


66

погляньмо на теорію 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};
}

У мене є кілька тестових випадків, які відповідають такому формату, як testxyz (), testpqr (). Мій існуючий клас тесту розширює TestCase.
Гірідхар

1
спочатку ви повинні перетворити їх на JUnit 4 (просто використовуючи анотацію @Test, у більшості випадків)
dfa

просто чудово, що працює. У цьому випадку ви запропонували мені використовувати певні анотації. Звідки я знаю, які є анотації і що використовувати щодо junit?
Гірідхар

Що, якби я хотів, щоб це діяло як набір різних тестів, щоб я міг побачити, яка точка даних робить тест невдалим? (тобто у вашому прикладі я мав би 4 проходження тестів і 1 провал, замість одного невдалого тесту)
Манріко Корацці

Чи можна мати точки даних одного типу? для напр .: дві точки даних з int []
Сарат

24

Здається, це ідеальний кандидат для параметризованих тестів.

Але в основному параметризовані тести дозволяють запускати один і той же набір тестів на різних даних.

Ось кілька хороших дописів про це в блозі:


12

Нещодавно я розпочав проект zohhak . Це дозволяє писати:

@TestWith({
   "25 USD, 7",
   "38 GBP, 2",
   "null,   0"
})
public void testMethod(Money money, int anotherParameter) {
   ...
}

1
Зверніть увагу, що за замовчуванням роздільником є ​​кома ,- якщо це суперечить вашим тестовим даним, ви можете змінити роздільник, вказавши його явно, тобто@TestWith({"25 USD# 0"}, separator = "#")
Роботник

7

Набагато кращий спосіб (дозволяє використовувати більше одного методу тестування) - це використовувати 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 тут .


3

Ось допис, який я написав, який показує кілька способів повторного запуску тестів із прикладами коду:

Повторно виконайте тест JUnit

Ви можете використати @Parametrized runner або використовувати спеціальний бігун, включений у публікацію


3

Якщо ви вже використовуєте a @RunWithу своєму тестовому класі, вам, мабуть, потрібно поглянути на це .


2018-01-19 проти. Будь ласка, будь ласка, пояснити своє мислення. Ви можете чогось навчитися.
гризун Майк

Це досить зарозумілий спосіб запитати це, що, як правило, гарантує відсутність відповіді. Вам було б набагато краще сказати: "хтось із нас може чомусь навчитися", оскільки цілком можливо, ви самі чогось пропустили.
TiggerToo

2

Я завжди просто створюю допоміжний метод, який виконує тест на основі параметрів, а потім викликаю цей метод із методу тестування JUnit. Зазвичай це означало б, що один метод тестування JUnit насправді виконував би багато тестів, але для мене це не було проблемою. Якщо вам потрібні кілька методів тестування, по одному для кожного окремого виклику, я рекомендую створити клас тесту.


1

Якщо ви не хочете або не можете використовувати власний бігун (наприклад, ви вже використовуєте інший бігун, наприклад Robolectric runner), ви можете спробувати це правило DataSet .

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.