Я использую 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
}
Мой код выше работает для первого теста, но каждый тест после того, что всегда возвращает те же самые результаты. Почему новые результаты не генерируются, даже если сделаны разные мутации?
вещи я попытался:
Testing, что различные мутации выполнены на каждой итерации цикла.
Проверка того, что новый код скомпилирован до запуска теста.
Запуск внутренних элементов цикла for в качестве потока, дождитесь окончания этого потока, затем выполните следующий тест.
Использование JUnitCore.runClasses (JUnitTest.class) вместо создания экземпляра ядра и вызова core.run (JUnitTest.class):
JUnitCore core = new JUnitCore(); Result result = core.run(JUnitTest.class);
Подставив JUnitCore (Org. JUnit) код для TestRunner (junit.textui), который дал мне ту же самую проблему:
TestSuite suite= new TestSuite(); suite.addTestSuite(JUnitTest.class); TestResult result = TestRunner.run(suite);
Блестящий. Я рассмотрел возможность запуска новой JVM для каждого мутанта, но я хотел бы знать, как использовать инструменты для замены классов в JVM. У вас есть какие-либо ссылки с чего начать? –
@ ZacharyTerlizzese Начните с официальной документации https://docs.oracle.com/javase/7/docs/api/java/lang/instrument/Instrumentation.html, а затем взгляните на то, как она делает https: // github. com/hcoles/pitest – henry
Спасибо за помощь Генри. Я также нашел это решение, которое может использовать один класс для другого, используя SomeJavaClass.class.getClassLoader(): http://stackoverflow.com/a/14317506/1008395 –