Невозможно запустить одиночный модульный тест с JUnit и Eclipse для тестирования, управляемого данными - PullRequest
1 голос
/ 28 марта 2011

Я снял проблему со всей ненужной сложности и приложил два файла для ясности.На самом деле, я хочу загрузить необходимые данные для тестирования из базы данных.В примере у меня есть карта наборов в классе Suites вместо результата запроса.У меня также есть довольно сложное сравнение вместо простого в методе run TestOverride.По сути, именно так я решил динамически создавать наборы тестов с их тестами из базы данных (карта наборов).Кроме того, важно, чтобы я мог видеть имя теста, когда я запускаю его с eclipse.

Если вы запускаете Suites (просто щелкните по нему правой кнопкой мыши и JUnit-запустите на eclipse), он работает нормально.Единственный тест, который проходит, это test4.Тем не менее, я хотел бы иметь возможность запустить один тест с этим типом конструкции (один набор также был бы хорош, но я был бы счастлив с одним тестом).Другими словами, после запуска всех пакетов я хотел бы перейти в окно JUnit, щелкнуть правой кнопкой мыши по одному тесту и запустить его.Если я это сделаю, это не сработает.Я почему-то думал, что тесты были сохранены где-то после первого запуска, и что я мог бы использовать их позже.

Я использую eclipse 3.6 и JUnit 4.0

Есть идеи?Я не использую аннотации для параметризованных классов, потому что все должно быть известно до времени компиляции (и я беру информацию из базы данных).Я также видел на форумах, что при таком подходе довольно сложно переименовать контрольные примеры.

import java.util.HashMap;
import java.util.Map;

import junit.framework.Test;
import junit.framework.TestSuite;

public class Suites {

public static Test suite() {
    Map<String, String[]> suites = new HashMap<String, String[]>();
    suites.put("suite1", new String[]{"test1", "test2"});
    suites.put("suite2", new String[]{"test3", "test4"});

    TestSuite all = new TestSuite("All Suites");
    for(Map.Entry<String, String[]> entry : suites.entrySet()) {
        TestSuite suite = new TestSuite(entry.getKey());
        for(String testName : entry.getValue()) {
            suite.addTest(
                    new TestOverride(
                            testName
                    )
            );
        }
        all.addTest(suite);
    }
    return all;
}
}

import junit.framework.AssertionFailedError;
import junit.framework.TestCase;
import junit.framework.TestResult;

public class TestOverride extends TestCase {

private String name;

public TestOverride(
        String name)
{
    this.name = name;
}

@Override
public void run(TestResult result) {
    result.startTest(this);
    if (this.name.equals("test4")) {
        result.endTest(this);
    } else {
        result.addFailure(this, new AssertionFailedError("Not test4"));
    }  
}

@Override
public String getName() {
    return name;
}
}

Ответы [ 2 ]

0 голосов
/ 24 августа 2012

Намного проще, если вы переопределите runTest() и создадите TestSuite из своего TestCase класса.

Вот пример, который работает: http://mrlalonde.blogspot.ca/2012/08/data-driven-tests-with-junit.html

0 голосов
/ 29 марта 2011

Я не думаю, что можно достичь того, что вы хотите.Насколько я знаю (и испытал), только «настоящие» методы junit (которые являются фактическими методами в существующих классах) могут быть выполнены из окна junit (это легко воспроизводится при использовании параметризованных тестов. Определенные тесты не могут быть выполненыи здесь тоже).

Возможно, вам следует попытаться сгенерировать Java-код для тестов (и скомпилировать его).

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...