Così ho una suite, qualcosa di simile:Un test watcher di riportare i risultati dei singoli test in JUnit Suite
@RunWith(Suite.class)
@Suite.SuiteClasses({TestClass1.class, TestClass2.class, TestClass3.class})
public class TestSuite {
static List<ExtentTest> extentTestList = new ArrayList<>();
@ClassRule
public static ExtentWatcher extentWatcher = new ExtentWatcher() {
@Override
protected void starting(Description description) {
extentTestList.addAll(extentWatcher.getTests());
}
@Override
protected void finished(Description description) {
extentWatcher.flushReports(extentTestList);
}
};
}
Il codice precedente funziona, ma il problema è che il risultato e 'il mio Osservatore riportare i risultati della Suite, non i singoli test. Inoltre, se un test fallisce, la suite continua a essere trasmessa. Il mio Watcher è qualcosa di simile:
public class ExtentWatcher extends TestWatcher {
// A little set up to give the report a date in the file name
private DateFormat dateFormat = new SimpleDateFormat("dd-MM-yyyy");
private Date date = new Date();
private String fileDate = dateFormat.format(date);
private String reportName = "./Test_Report_" + fileDate + ".html";
public ExtentReports extent;
ArrayList<ExtentTest> testList = new ArrayList<>();
public ExtentWatcher() {
extent = createReport();
}
// If test passed, watcher will record this with Extent Reports
@Override
protected void succeeded(Description description) {
ExtentTest test = extent.startTest(description.getDisplayName());
test.log(LogStatus.PASS, "Test Run Successful");
testList.add(test);
}
// Likewise in case of failure
@Override
protected void failed(Throwable e, Description description) {
ExtentTest test = extent.startTest(description.getDisplayName());
test.log(LogStatus.FAIL, "Test Failure: " + e.toString());
testList.add(test);
}
/**
* These methods do the legwork - this file is based off of an example I found @ www.kieftsoft.nl/?p=81
* Eventually we can add some screenshot logic here, but just a clean test report and version info will do
*/
private ExtentReports createReport() {
// Create the report - Extent just needs a little config
ExtentReports extent = new ExtentReports(reportName, false);
extent.config().reportName("Test Report: " + fileDate);
return extent;
}
public void flushReports(List<ExtentTest> testList) {
// This ends the test and then sends (flushes) everything to the html document
for(ExtentTest test : testList) extent.endTest(test);
extent.flush();
}
public List<ExtentTest> getTests() {
return testList;
}
}
Questo codice funziona bene annotato come @Rule per un singolo test (con un rapporto per ogni test singolarmente, non auspicabile), ma di cui al precedente, questo non sta lavorando su un livello Suite e non sono davvero sicuro di come farlo funzionare. Stavo pensando di raccogliere un elenco di tutti i test e, nella suite, terminare i test e scaricarli, il che consentirà a ExtentReport di fornirmi una relazione su tutti i test. Tuttavia, non sono in grado di ottenere in modo specifico i risultati dei singoli test: riceverò un test indietro, con displayName() = il nome della suite.
Come è possibile tenere traccia dei singoli test, quindi svuotarli quando tutti sono terminati e lasciare che ExtentWatcher si occupi del pass/fail su un test per test, anziché solo una volta per la suite?
Funziona dopo aver aggiunto flushReports in riuscito e non riuscito? – Karthik
Non correlato al problema: perché non si aggiorna all'ultima versione? – Karthik
No, se eseguo il flush in riuscito o non riuscito riceverò un report per ogni test. Attualmente sto usando l'ultima versione. –