Параметризованные классы тестового сценария в JUnit 3.x

Обычно мы используем pipe() при использовании httpclient.

this.http.get(url).pipe(map(a => b), catchError(error => this.handleError(error)));

Так же, как его комментарии httpClient.get():

/**
 * Construct a GET request which interprets the body as JSON and returns it.
 *
 * @return an `Observable` of the body as type `T`.
 */
blockquote>

Так как он возвращает Obervable, то вы следуете по трубе к объединить функции в цепочку.

Советы

  • вы должны использовать !== и === в JS, чтобы избежать странных результатов;
  • обычно мы не subscribe сразу после [ 119] и мы помещаем метод get в отдельный сервис ;

5
задан JesperE 13 October 2008 в 12:18
поделиться

3 ответа

Если это - Java 5 или выше, Вы могли бы хотеть рассмотреть переключение на JUnit 4, который имеет поддержку параметризованных встроенных тестовых сценариев.

3
ответ дан 13 December 2019 в 19:38
поделиться

Хорошо, вот быстрый макет того, как JUnit 4 запускает параметризованные тесты, но сделанный в JUnit 3.8.2.

В основном я разделяю на подклассы и плохо угоняю класс TestSuite для заполнения списка тестов согласно векторному произведению testMethods и параметров.

К сожалению, я должен был скопировать несколько вспомогательных методов с самого TestSuite, и несколько деталей не прекрасны, таковы как названия тестов в IDE, являющемся тем же через наборы параметра (JUnit 4.x добавляет [0], [1], ...).

Тем не менее, это, кажется, хорошо работает в тексте и AWT TestRunners, что поставка с JUnit, а также в Eclipse.

Вот ParameterizedTestSuite и далее вниз (глупый) пример параметризованного теста с помощью него.

(заключительное примечание: я записал это с Java 5 в памяти, это должно быть тривиально для адаптации к 1,4 в случае необходимости),

ParameterizedTestSuite.java:

package junit.parameterized;

import java.lang.reflect.Constructor;
import java.lang.reflect.InvocationTargetException;
import java.lang.reflect.Method;
import java.lang.reflect.Modifier;
import java.util.ArrayList;
import java.util.Collection;

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

public class ParameterizedTestSuite extends TestSuite {

    public ParameterizedTestSuite(
            final Class<? extends TestCase> testCaseClass,
            final Collection<Object[]> parameters) {

        setName(testCaseClass.getName());

        final Constructor<?>[] constructors = testCaseClass.getConstructors();
        if (constructors.length != 1) {
            addTest(warning(testCaseClass.getName()
                    + " must have a single public constructor."));
            return;
        }

        final Collection<String> names = getTestMethods(testCaseClass);

        final Constructor<?> constructor = constructors[0];
        final Collection<TestCase> testCaseInstances = new ArrayList<TestCase>();
        try {
            for (final Object[] objects : parameters) {
                for (final String name : names) {
                    TestCase testCase = (TestCase) constructor.newInstance(objects);
                    testCase.setName(name);
                    testCaseInstances.add(testCase);
                }
            }
        } catch (IllegalArgumentException e) {
            addConstructionException(e);
            return;
        } catch (InstantiationException e) {
            addConstructionException(e);
            return;
        } catch (IllegalAccessException e) {
            addConstructionException(e);
            return;
        } catch (InvocationTargetException e) {
            addConstructionException(e);
            return;
        }


        for (final TestCase testCase : testCaseInstances) {
            addTest(testCase);
        }       
    }
    private Collection<String> getTestMethods(
            final Class<? extends TestCase> testCaseClass) {
        Class<?> superClass= testCaseClass;
        final Collection<String> names= new ArrayList<String>();
        while (Test.class.isAssignableFrom(superClass)) {
            Method[] methods= superClass.getDeclaredMethods();
            for (int i= 0; i < methods.length; i++) {
                addTestMethod(methods[i], names, testCaseClass);
            }
            superClass = superClass.getSuperclass();
        }
        return names;
    }
    private void addTestMethod(Method m, Collection<String> names, Class<?> theClass) {
        String name= m.getName();
        if (names.contains(name))
            return;
        if (! isPublicTestMethod(m)) {
            if (isTestMethod(m))
                addTest(warning("Test method isn't public: "+m.getName()));
            return;
        }
        names.add(name);
    }

    private boolean isPublicTestMethod(Method m) {
        return isTestMethod(m) && Modifier.isPublic(m.getModifiers());
     }

    private boolean isTestMethod(Method m) {
        String name= m.getName();
        Class<?>[] parameters= m.getParameterTypes();
        Class<?> returnType= m.getReturnType();
        return parameters.length == 0 && name.startsWith("test") && returnType.equals(Void.TYPE);
     }

    private void addConstructionException(Exception e) {
        addTest(warning("Instantiation of a testCase failed "
                + e.getClass().getName() + " " + e.getMessage()));
    }

}

ParameterizedTest.java:

package junit.parameterized;
import java.util.Arrays;
import java.util.Collection;

import junit.framework.Test;
import junit.framework.TestCase;
import junit.parameterized.ParameterizedTestSuite;


public class ParameterizedTest extends TestCase {

    private final int value;
    private int evilState;

    public static Collection<Object[]> parameters() {
        return Arrays.asList(
                new Object[] { 1 },
                new Object[] { 2 },
                new Object[] { -2 }
                );
    }

    public ParameterizedTest(final int value) {
        this.value = value;
    }

    public void testMathPow() {
        final int square = value * value;
        final int powSquare = (int) Math.pow(value, 2) + evilState;
        assertEquals(square, powSquare);
        evilState++;
    }

    public void testIntDiv() {
        final int div = value / value;
        assertEquals(1, div);
    }

    public static Test suite() {
        return new ParameterizedTestSuite(ParameterizedTest.class, parameters());
    }
}

Примечание: evilState переменная должна просто здесь показать, что все тестовые экземпляры отличаются, как они должны быть, и что нет никакого общего состояния между ними.

3
ответ дан 13 December 2019 в 19:38
поделиться

Вместо того, чтобы создавать параметризованный тестовый сценарий для нескольких/отличающихся бэкендов, Вы хотите протестировать против, я изучил бы создание моего краткого обзора тестовых сценариев. Каждая новая реализация Вашего API должна была бы предоставить реализацию класс TestCase.

Если у Вас в настоящее время есть метод тестирования, который смотрит что-то как

public void testSomething() {
   API myAPI = new BlahAPI();
   assertNotNull(myAPI.something());
}

просто добавьте абстрактный метод для TestCase, который возвращает определенный объект API использовать.

public abstract class AbstractTestCase extends TestCase {
    public abstract API getAPIToTest();

    public void testSomething() {
       API myAPI = getAPIToTest();
       assertNotNull(myAPI.something());
    }

    public void testSomethingElse() {
       API myAPI = getAPIToTest();
       assertNotNull(myAPI.somethingElse());
    }
}

Затем TestCase для новой реализации, которую Вы хотите протестировать только, должен реализовать Ваш AbstractTestCase и предоставить конкретную реализацию класса API:

public class ImplementationXTestCase extends AbstractTestCase{

    public API getAPIToTest() {
        return new ImplementationX();
    }
}

Затем все методы тестирования, которые тестируют API в абстрактном классе, выполняются автоматически.

3
ответ дан 13 December 2019 в 19:38
поделиться
Другие вопросы по тегам:

Похожие вопросы: