Ваше предлагаемое решение кажется разумным, за исключением того, что предлагаемое решение связывает тест и запрос по времени. Я пытался делать подобные вещи раньше, и это работает. Большую часть времени. Если вы не будете писать свой код JUnit очень тщательно, у вас будет много проблем из-за различий во времени между двумя машинами или если у вас есть только одна машина, просто сопоставьте одно время с другим.
Лучшим решением было бы реализовать Tomcat Valve , который можно вставить в жизненный цикл в файле server.xml для вашего веб-приложения. Преимущество Valves заключается в том, что вы определяете их в файле server.xml, поэтому вы вообще не касаетесь веб-приложения.
Вам нужно будет реализовать invoke (). Лучше всего начать с AccessLogValve . Это реализация в AccessLogValve:
/**
* Log a message summarizing the specified request and response, according
* to the format specified by the <code>pattern</code> property.
*
* @param request Request being processed
* @param response Response being processed
*
* @exception IOException if an input/output error has occurred
* @exception ServletException if a servlet error has occurred
*/
public void invoke(Request request, Response response) throws IOException,
ServletException {
if (started && getEnabled()) {
// Pass this request on to the next valve in our pipeline
long t1 = System.currentTimeMillis();
getNext().invoke(request, response);
long t2 = System.currentTimeMillis();
long time = t2 - t1;
if (logElements == null || condition != null
&& null != request.getRequest().getAttribute(condition)) {
return;
}
Date date = getDate();
StringBuffer result = new StringBuffer(128);
for (int i = 0; i < logElements.length; i++) {
logElements[i].addElement(result, date, request, response, time);
}
log(result.toString());
} else
getNext().invoke(request, response);
}
Все, что это делает, регистрирует тот факт, что вы получили к нему доступ.
Вы бы внедрили новый клапан. Для ваших запросов вы передаете уникальный идентификатор в качестве параметра для URL, который используется для идентификации выполняемых вами тестов. Ваш клапан будет выполнять всю тяжелую работу до и после вызова (). Вы можете удалить, удалить уникальный параметр для getNext (). Invoke (), если это необходимо.
Чтобы измерить покрытие, вы можете использовать инструмент покрытия, предложенный JB Nizet, на основе уникального идентификатора, который вы передаете.
Итак, из junit, если ваш исходный вызов был
@Test void testSomething() {
selenium.open("http://localhost/foo.jsp?bar=14");
}
Вы бы изменили это на:
@Test void testSomething() {
selenium.open("http://localhost/foo.jsp?bar=14&testId=testSomething");
}
Тогда вы бы выбрали параметр testId в вашем клапане.