2016-04-24 2 views
0

Я использую JUnit 4 с Eclipse JDT для создания автоматизированного тестирования мутантов.Почему JUnitCore возвращает только первые результаты?

Вот общий обзор моей структуры кода:

//Basic for loop 
for(int i = 0; i < 10; i++) { 

    //Read in source code from a Java file 
    ...(works) 

    //Change a line using JDT and save code to a new Java file 
    ...(works) 

    //Compile new Java file (this also works) 
    try {  
     Process compile = Runtime.getRuntime().exec("javac -cp \"src/*\" " + path + "*.java"); 
     compile.waitFor(); 
    } catch(IOException ex) { /*...*/ } 
     catch(InterruptedException ex) { /*...*/ } 

    //Run JUnit Tests (this works the first time it is called) 
    JUnitCore core = new JUnitCore(); 
    Result result = core.run(JUnitTest.class); //This class contains my JUnit Tests 
} 

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

вещи я попытался:

  1. Testing, что различные мутации выполнены на каждой итерации цикла.

  2. Проверка того, что новый код скомпилирован до запуска теста.

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

  4. Использование JUnitCore.runClasses (JUnitTest.class) вместо создания экземпляра ядра и вызова core.run (JUnitTest.class):

    JUnitCore core = new JUnitCore(); 
    Result result = core.run(JUnitTest.class); 
    
  5. Подставив JUnitCore (Org. JUnit) код для TestRunner (junit.textui), который дал мне ту же самую проблему:

    TestSuite suite= new TestSuite(); 
    suite.addTestSuite(JUnitTest.class); 
    TestResult result = TestRunner.run(suite); 
    

ответ

2

Вам нужно вставить мутанта в JVM - хотя вы компилируете измененный файл, JVM увидит только первую загруженную версию.

Существует множество способов сделать это, начиная с запуска новой JVM для каждого мутанта до использования API-интерфейса инструментария.

+0

Блестящий. Я рассмотрел возможность запуска новой JVM для каждого мутанта, но я хотел бы знать, как использовать инструменты для замены классов в JVM. У вас есть какие-либо ссылки с чего начать? –

+0

@ ZacharyTerlizzese Начните с официальной документации https://docs.oracle.com/javase/7/docs/api/java/lang/instrument/Instrumentation.html, а затем взгляните на то, как она делает https: // github. com/hcoles/pitest – henry

+0

Спасибо за помощь Генри. Я также нашел это решение, которое может использовать один класс для другого, используя SomeJavaClass.class.getClassLoader(): http://stackoverflow.com/a/14317506/1008395 –

0

Почему вы используете цикл от = 0 к я = 10, и при использовании этого цикла, чем когда вы используете значение я внутри кода. Я думаю, что это не использует значение i, в результате чего вы получаете одинаковый результат каждый раз.

+0

Цикл представляет собой сводку более продвинутого кода. На самом деле я искал код для каждого выражения Infix и мутировал его. Количество циклов может меняться, поэтому для простоты я рекламировал этот вопрос как простой запуск 10 раз (хотя даже дважды не работает). –

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