Такие исходные условия вносят свои коррективы в Test Driven Development от Кента Бека: все тесты запускаются только перед отправкой кода в реппозиторий + более тесная работа ведется только с неким набором тестов. Все усугубляется тем, что обновления из реппозитория вносят свои погрешности - каждый раз что-то ломается. По этой причине обновление делается вечером, а тесты запускаются на ночь - утром я получаю список поломанных тестов и начинаю выяснять в чем дело (естественно через debug, ибо интеграционные тесты не дают информации где поломалось, они только говорят что что-то в процессе QWE поломалось). Но даже такое использование тестов здоровско спасает, иначе я вообще не контролировал бы ничего.
Итак в чем трудность: работать с jUnit тестами через Eclipse плагин не совсем удобно. Есть там кнопочка "Run Test - Failure First", но если Suite состоит из нескольких TestCase, то в каждом отдельном TestCase вначале запустятся красные тесты, а потом зеленые.
В общем получится, что мне надо ждать почти тех же 3 часа, чтобы увидеть как картина изменилась. Нет возможности запустить только нерабочие тесты. Реализуем эту возможность.
Если обратить внимание, то на той же панели jUnit Runner GUI есть кнопка для работы с историей запусков. Там же есть возможность импортировать результаты в виде xml. Оу!
Сохраним результаты выполнения...
А вот пример внутренней структуры xml с описанием отработанного suite...
Ну что, вперед!...
Немного поковырявшись в xml парсерах я остановился на jDom как самом простом. Качнул либу jdom.jar и написал простенький класс.
package com; import java.io.File; import java.io.IOException; import java.util.ArrayList; import java.util.List; import org.jdom.Document; import org.jdom.Element; import org.jdom.JDOMException; import org.jdom.input.SAXBuilder; public class SuiteBuilder { public static void main(String[] args) throws JDOMException, IOException { Listtests = new ArrayList (); processTestSuiteNode(tests, loadXml("c:/broken.xml").getRootElement()); buildSuiteClass(tests); } private static Document loadXml(String fileName) throws JDOMException, IOException { SAXBuilder saxBuilder = new SAXBuilder(); return saxBuilder.build(new File(fileName)); } private static void buildSuiteClass(List tests) { System.out.println("package com;"); System.out.println(""); System.out.println("import junit.framework.Test;"); System.out.println("import junit.framework.TestSuite;"); System.out.println(""); System.out.println("public final class AllBrokenTests {"); System.out.println(""); System.out.println(" private AllBrokenTests() {"); System.out.println(" }"); System.out.println(""); System.out.println(" public static Test suite() {"); System.out.println(" final TestSuite suite = new TestSuite();"); for ( String test : tests ) { System.out.println(" " + test); } System.out.println(" return suite;"); System.out.println(" }"); System.out.println("}"); } private static void processTestSuiteNode(List tests, Element rootTestSuite) { List testSuites = rootTestSuite.getChildren("testsuite"); for ( Element testSuite : testSuites ) { processTestSuiteNode(tests, testSuite); } List testCases = rootTestSuite.getChildren("testcase"); for ( Element testCase : testCases ) { processTestCaseNode(tests, testCase); } } private static void processTestCaseNode(List tests, Element testCase) { if ( testCase.getChild("error") == null && testCase.getChild("failure") == null ) { return; } tests.add("suite.addTest(new " + testCase.getAttributeValue("classname") + "(\"" + testCase.getAttributeValue("name") + "\");"); } }
Думаю с загрузкой файлов сам разберешься.
В результате выполнения метода main в консоль выплевывается класс, который можно скопипастить и воспользоваться для запусков поломанных тестов...
Комментариев нет:
Отправить комментарий