2009-09-18 2 views
21

Я имею классическую структуру тестов, у меня есть тестовый набор различных сьютов, как DatabaseTests, UnitTests и т.д. Иногда эти люксы содержат другие пакеты как SlowDatabaseTests, FastDatabaseTests и т.д.Как я могу выполнить тесты JUnit в случайном порядке?

То, что я хочу, чтобы рандомизации исправности поэтому я буду уверен, что они не зависят друг от друга. Рандомизация должна быть на каждом уровне, например, пакет должен перетасовывать порядок тестового класса, а класс проверки должен перетасовывать метод метода тестирования.

Если это возможно сделать в Eclipse, это будет лучшим.

+7

Рандомизация заказа ничего не докажет, так как случайный может работать «случайно». Кроме того, это не будет повторяемо, и поэтому вы никогда не сможете отслеживать причину сбоя. – skaffman

+3

Если я пишу свой заказ на выполнение где-то каждый раз, когда выполняются тесты, я смогу отслеживать причину. – nimcap

+8

Вы можете сделать его повторяемым, предоставив Random() семя, которое является функцией даты без времени. Если вы это сделаете, я настоятельно рекомендую непрерывную сборку, чтобы вы заметили, когда тесты терпят неудачу. – NamshubWriter

ответ

12

У вас есть Sortable, но я не могу видеть, как вы будете использовать его.

Вы можете продлить BlockJUnit4ClassRunner и получить computeTestMethods(), чтобы получить рандомизированную копию super.computeTestMethods(). Затем используйте @RunWith, чтобы установить это как используемый бегун.

например.

package com.stackoverflow.mlk; 

import java.util.Collections; 

import org.junit.runners.BlockJUnit4ClassRunner; 
import org.junit.runners.model.InitializationError; 

public class RandomBlockJUnit4ClassRunner extends BlockJUnit4ClassRunner { 

    public RandomBlockJUnit4ClassRunner(Class<?> klass) 
      throws InitializationError { 
     super(klass); 
    } 

    protected java.util.List<org.junit.runners.model.FrameworkMethod> computeTestMethods() { 
     java.util.List<org.junit.runners.model.FrameworkMethod> methods = super.computeTestMethods(); 
     Collections.shuffle(methods); 
     return methods; 
    } 

} 

Тогда

@RunWith(com.stackoverflow.mlk.RandomBlockJUnit4ClassRunner.class) 
public class RandomOrder { 
    @Test 
    public void one() { 
    } 

    @Test 
    public void two() { 
    } 

    @Test 
    public void three() { 
    } 
} 
+0

хороший ответ, но не вполне достаточный. Мне также нужно реализовать бегуна Suite, чтобы рандомизировать порядок тестовых классов. Кроме того, у меня много тестов, и я не хочу ставить @RunWith аннотацию во всех них. Я думаю, что это можно обработать в Suite runner – nimcap

+2

Я нашел это очень полезным, и я создал небольшой Java-проект, который рандомизирует тесты и сюиты. Для получения дополнительной информации посетите страницу: http://randomjunit.sourceforge.net/ – AngocA

0

Я убедиться, что они не зависят в друг друга

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

+0

Могу ли я спросить, почему люди сбивают мой ответ? Что с этим не так? – 2009-09-18 12:45:36

+5

Мы очень осторожны при написании модульных тестов и обеспечении их независимости. Но мы также очень тщательно пишем производственный код, появляются ошибки, нет гарантии, что они будут независимыми. PS. Мы используем JUnit для не только модульных тестов, но и для функциональных тестов, поэтому они иногда оставляют DB в определенном состоянии. – nimcap

+5

@lutz Я думаю, потому что вы противопоставили другой вопрос, не отвечая на вопрос OP – akuhn

3

В общем, что вам нужно сделать, это написать собственный тестовый бегун, а в классе тестового бегуна агрегировать методы и произвольно запускать каждый тест (убедитесь, что вы не дважды запускаете тест).

Подробнее о тестовой базы и, как написать свой собственный тест бегун здесь: http://www.ddj.com/architect/184415674

+0

Обратите внимание, что статья ddj.com описывает тестовый бегун JUnit3. Если вы попробуете это, имейте в виду, что если ваши тесты используют TestSetup или пытаются выполнить настройку на уровне пакета и срывать его, расширяя TestSuite, предлагаемый здесь подход не будет работать; тестовый бегун не «видит» TestSuites или TestDecorators. Написание собственного тестового бегуна JUnit3 также не будет работать, если вы запускаете тесты из среды IDE, например Eclipse. – NamshubWriter

4

https://github.com/KentBeck/junit/pull/386 вводит некоторые заказы, но не RANDOM. Наверное, вы этого не хотите; тесты должны выполняться детерминистически. Если вам нужно проверить, что разные перестановки тестов все равно проходят, либо проверьте все перестановки; или, если это было бы непрактично медленным, ввести «случайное» семя для перетасовки, которое определяется переменной окружения или тому подобным, чтобы вы могли воспроизвести любые сбои. http://hg.netbeans.org/main/file/66d9fb12e98f/nbjunit/src/org/netbeans/junit/MethodOrder.java дает пример этого для JUnit 3.

Смежные вопросы