#java #code-coverage
#java #покрытие кода
Вопрос:
основной метод:
public static void main(String[] args) throws Exception
{
if (args.length != EXPECTED_NUMBER_OF_ARGUMENTS)
{
System.err.println("Usage - java XFRCompiler ConfigXML PackageXML XFR");
}
String configXML = args[0];
String packageXML = args[1];
String xfr = args[2];
AutoConfigCompiler compiler = new AutoConfigCompiler();
compiler.setConfigDocument(loadDocument(configXML));
compiler.setPackageInfoDoc(loadDocument(packageXML));
// compiler.setVisiblityDoc(loadDocument("VisibilityFilter.xml"));
compiler.compileModel(xfr);
}
private static Document loadDocument(String fileName) throws Exception
{
TXDOMParser parser = (TXDOMParser) ParserFactory.makeParser(TXDOMParser.class.getName());
InputSource source = new InputSource(new FileInputStream(fileName));
parser.parse(source);
return parser.getDocument();
}
testcase:
@Test
public void testCompileModel() throws Exception
{
// construct parameters
URL configFile = Thread.currentThread().getContextClassLoader().getResource("Ford_2008_Mustang_Config.xml");
URL packageFile = Thread.currentThread().getContextClassLoader().getResource("Ford_2008_Mustang_Package.xml");
File tmpFile = new File("Ford_2008_Mustang_tmp.xfr");
if(!tmpFile.exists()) {
tmpFile.createNewFile();
}
String[] args = new String[]{configFile.getPath(),packageFile.getPath(),tmpFile.getPath()};
try {
// test main method
XFRCompiler.main(args);
} catch (Exception e) {
assertTrue(true);
}
try {
// test args length is less than 3
XFRCompiler.main(new String[]{"",""});
} catch (Exception e) {
//ignore
}
tmpFile.delete();
}
Выходные данные покрытия отображаются в виде строк из String configXML = args[0];
в основном методе
не охвачены.
Комментарии:
1. Вы пишете тесты способом, который в некотором роде … отличается. Как правило, модульные тесты имеют возможность завершиться неудачей. Ваш всегда будет проходить.
2. Значение EXPECTED_NUMBER_OF_ARGUMENTS равно 3? Кроме того, в этой первой попытке / catch у меня было бы assert . Сбой, поскольку вы не ожидаете, что эта часть теста выдаст исключение.
3. да, 3. не имеет значения, вызывает он исключение или нет, дело в том, что покрытие, отображаемое как основной метод, не охвачено.
4. @Mike — Суть в том, что если бы он выдавал исключение (и, следовательно, фактически не запускал строки, которые вы ожидали), вы бы этого не поймали, поскольку блок catch просто утверждает true и продолжает работу.
5. странно, «String configXML = args[0];» не вызовет исключения, верно? но в покрытии указано, что эта строка не покрыта.
Ответ №1:
assertTrue(true);
это бессмысленный отказ от операции- Удалите try / catch вокруг вызова
XFRCompiler.main(args);
, поскольку все, что он делает, это проглатывает исключения и усложняет отладку; скорее всего, вы увидите исключение, которое сообщит вам, в чем проблема. - После вызова
fail()
должен быть вызовXFRCompiler.main(new String[]{"",""});
, поскольку вы ожидаете, что он вызовет исключение - Поместите два вызова в отдельные методы тестирования.
Ответ №2:
Я беспокоюсь обо всем этом assertTrue(true)
. Если исключения быть не может, то утверждение не требуется. Если возникнет неожиданное исключение, то этот код проглотит его, и вы получите поведение, которое видите прямо сейчас.
Тогда, если вы ожидаете исключения, вы должны написать код следующим образом:
try {
... code that will throw an exception ...
fail("No exception was thrown");
} catch (SpecficTypeOfException e) {
assertEquals("message", e.getMessage());
}
Таким образом, будут проверены неправильные типы исключений и сообщение об исключении.
PS: Не отправляйте вопросы с пометкой «срочно». Мы уже помогаем так быстро, как только можем.
Комментарии:
1. Спасибо за ваш ответ. Даже он может пройти, но отчеты о покрытии по-прежнему отображаются, поскольку основной метод не был охвачен.
2. Запустите код в отладчике, чтобы на 100% убедиться, что он действительно выполняет эти строки. Возможно, мы чего-то не хватает.