2016-10-11 4 views
2

Мне интересно, будет ли у меня какое-то условие гонки, если я буду запускать свои тесты параллельно, а два теста (см. Ниже) передают переменную экземпляра? Поэтому мой тестовый класс работает с SpringJunit4ClassRunner, и у меня есть 2 метода тестов a() и b(), переменная state будет изменена или переназначена из каждого теста, а doSomethingWithState() будет использовать переменную state и передать ее на тестирование метод. Я знаю, что с maven-surefire-plugin вы можете запустить его на уровне метода, чтобы и(), и b() были назначены потоку и запускали его параллельно.Состояние гонки при параллельном параллельном тестировании junit

@RunWith(SpringJUnit4ClassRunner.class) 
public class TestA { 

    private Object state; 

    @Test 
    public void a() { 
      stateObjectA(); 
      doSomethingWithState(); 
      assertion(); 
    } 

    @Test 
    public void b() { 
      stateObjectB(); 
      doSomethingWithState(); 
      assertion(); 
    } 

    private void stateObjectA() { 
      // do some mocking and setup state 
    } 

    private void stateObjectB() { 
      // do some mocking and setup state 
    } 

    private void doSomethingWithState() { 
      // use the state object and feed into the testing method 
    } 
} 
+0

Где находится аннотация '@ Test'? – dit

+0

OOps ... я только что обновил его – peter

+3

Отметив, что [JUnit4 создает новый экземпляр для каждого тестового метода] (http://stackoverflow.com/questions/19381352/does-junit-reinitialize-the-class-with-each-test -method-invocation): у вас есть отдельный экземпляр 'state' для каждого метода, поэтому не будет вмешательства потока. См. Также сообщение в блоге Мартина Фаулера об этом (http://www.martinfowler.com/bliki/JunitNewInstance.html). –

ответ

2

Я думаю, единственный разумный ответ: зависит ... от конкретного контекста и коды.

Сути, если условия гонки: вы должны более чем один поток манипуляционных («письмо») к совместно данных. Ваш длительный вопрос сводится к такой настройке. Таким образом, существует высокий потенциал для условий гонки в настройках, описанных выше.

И тогда: это не имеет никакого значения, если вы говорите о методах в производственном коде или методах, называемых некоторой средой тестирования. Потому что условия гонки не заботятся об этом. Они только «заботятся» о более чем одном потоке, записывающем общие данные.

Это все, что имеет значение здесь!

0

Вы должны принять во внимание две вещи:

  • Если вам требуется использовать переменные экземпляра, то экземпляр их перед загрузкой (Junit4 обеспечивает @Before, @After аннотаций и @BeforeClass и @AfterClass для статического переменные).

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

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

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