Экстренный отчет Выпуск Параллельное тестирование
У меня есть следующий код сообщения:
public class Reporting {
private ExtentHtmlReporter extentHtmlReporter;
private static ThreadLocal<ExtentReports> extentReports = new ThreadLocal<>();
private static ThreadLocal<ExtentTest> extentTest = new ThreadLocal<>();
public synchronized ExtentTest createInstanceReport(String testCaseName) {
System.out.println(extentReports.get());
new File(Constants.userDir + "/Reports/").mkdirs();
// To generate report with name
extentHtmlReporter = new ExtentHtmlReporter(
Constants.userDir + "/Reports/" +
"ExecutionReport_" + new SimpleDateFormat(
Constants.date).format(new Date()) + ".html");
// Setting Document Title
extentHtmlReporter.config().setDocumentTitle("Demo");
// Setting Report Name
extentHtmlReporter.config().setReportName("Demo Automation");
// Setting Theme
extentHtmlReporter.config().setTheme(Theme.STANDARD);
// Setting Chart location
extentHtmlReporter.config().setTestViewChartLocation(ChartLocation.TOP);
// Setting Chart visibility
extentHtmlReporter.config().setChartVisibilityOnOpen(false);
// Setting Time stamp
extentHtmlReporter.config().setTimeStampFormat("yyyy-MM-dd HH:mm:ss");
// Setting append exist as true
extentHtmlReporter.setAppendExisting(true);
ExtentReports extentReports = new ExtentReports();
extentReports.attachReporter(extentHtmlReporter);
// Setting system info
extentReports.setSystemInfo("Name",
BaseTest.prop.getProperty(Constants.testerName));
extentReports.setSystemInfo("Environment",
BaseTest.prop.getProperty(Constants.environment));
extentReports.setSystemInfo("Browser",
BaseTest.prop.getProperty(Constants.browser));
Reporting.extentReports.set(extentReports); // Instead of using here extentReport thread like this, Can anyone suggest to use it directly
// Add test case name in report
ExtentTest extentTest = Reporting.extentTest.get();
extentTest = Reporting.extentReports.get().createTest(testCaseName);
Reporting.extentTest.set(extentTest);
// Assigning categories
extentTest.assignCategory(MultiFunction.getProp()
.getProperty(Constants.browser));
System.out.println(Reporting.extentReports.get());
System.out.println(Reporting.extentTest.get());
return extentTest;
}
public synchronized ExtentTest getExtentTest() {
return extentTest.get();
}
public synchronized ExtentReports getInstanceReport() {
return extentReports.get();
}
public synchronized void remove() {
extentReports.remove();
extentTest.remove();
}
}
Я пробовал параллельное тестирование с использованием TestNG (и в будущем мне придется использовать решетку и соус Selenium). Я выполняю 2 теста, после чего в отчет добавляется только один результат теста.
Я выделила extentTest
, extentReporter
и экземпляры WebDriver, использующие threadPool.
Пробовал ниже с extentHtmlReporter
пример:
1) Tried to make it static(no luck)
2) Tried to make it local (the same behaviour, getting only 1 test case result)
3) Tried as a non-static global variable ( no luck)
Не могли бы вы предложить, как решить вышеуказанную проблему?
Обратите внимание: генерируется только один отчет. Но когда я пытался запустить параллельные тестовые случаи в режиме отладки, отчеты генерировались для обоих тестовых случаев. Я думаю, потому что один тестовый пример преодолевает убийство некоторого экземпляра (при работе в режиме без отладки)
Кроме того, я хочу изменить следующее место в моем коде:
За extentRpeort
, Я использую:
Reporting.extentReports.set (extentReports);
Добавить extentReport
экземпляр моего extentReport
Нить.
Вместо того, чтобы добавлять подобное, я хочу использовать его напрямую, чтобы уменьшить количество строк кода.
3 ответа
Проблема была связана со сбросом экземпляра отчета по экстентам. Я использовал ThreadLocal для хранения экземпляра отчета экстента и сбрасывал неправильный экземпляр.
Если я правильно понимаю, вы должны сгенерировать отчет по всем выполненным тестам TestNG.
Однако из кода, которым вы поделились, очень хорошо видно, что у вас будут некоторые проблемы с ним. Вы делаете несколько критических ошибок, и результат очевиден:
Для создания отчетов с помощью TestNG я предлагаю получить информацию о выполнении теста из прослушивателя TestNG. Что-то вроде:
public final class TestNGListener extends TestListenerAdapter implements IInvokedMethodListener, ISuiteListener { @Override public void onStart(ITestContext context) { Logger.info(buildMessage(Logger.PREFIX_TEST_STARTED, context.getName())); } @Override public void onFinish(ITestContext context) { Logger.info(buildMessage(Logger.PREFIX_TEST_FINISHED, context.getName())); } @Override public void onTestStart(ITestResult result) { Logger.info(buildMessage(Logger.PREFIX_METHOD_STARTED, getMethodName(result))); } @Override public void onTestSuccess(ITestResult result) { Logger.info(buildMessage(Logger.PREFIX_METHOD_SUCCESS, getMethodName(result))); processTestResult(result); } @Override public void onTestFailure(ITestResult result) { Logger.info(buildMessage(Logger.PREFIX_METHOD_FAILED, getMethodName(result))); }
Вы не можете сделать все одним способом! Вы нарушили принцип единой ответственности. Ваш
createInstanceReport()
выполняет все задания (устанавливает детали отчета, устанавливает системную информацию, прикрепляет выполненный тестовый пример к отчету) в одном месте. Вы должны перепроектировать эту логику для некоторых логических отдельных операций. После изменения вашей проблемы со следующей строкой:
Reporting.extentReports.set (extentReports)
Может успешно исчезнуть.
- Вы должны рассмотреть случай, почему вы должны использовать именно
Extent, Reports Version 3
, TestNG имеет протоколы испытаний из коробки. Они бедны, но представлены из коробки. Если вы хотите просто немного его улучшить, вы можете использовать ReportNG вместо TestNG.
Это довольно легко настроить: Настройка ReportNG с TestNG для отчетов HTML.
Это не поддерживается, но делает отчеты TestNG действительно приятными и понятными.
Во всяком случае, мое предложение заключается в использовании TestNGListener
для получения информации о выполнении тестовых случаев. И читайте больше о хорошей практике программирования.
Работа с прослушивателем TestNG/jUnit (или другой используемой средой выполнения), вот хороший пример, как это сделать. Не ставьте все в один класс.
https://www.swtestacademy.com/extent-reports-version-3-reporting-testng/
Я уже использую приведенный ниже код в моей среде. Вам нужно написать набор строк в прослушивателях TestNG в методе onTestStart(), часть кода вставлена ниже.
public void onStart(ITestContext context) {
System.out.println("*** Test Suite " + context.getName() + " started ***");
}
public void onFinish(ITestContext context) {
System.out.println(("*** Test Suite " + context.getName() + " ending ***"));
ExtentTestManager.endTest();
ExtentManager.getInstance().flush();
}
public void onTestStart(ITestResult result) {
System.out.println(("*** Running test method " + result.getMethod().getMethodName() + "..."));
ExtentTestManager.startTest(result.getMethod().getMethodName());
}
public void onTestSuccess(ITestResult result) {
System.out.println("*** Executed " + result.getMethod().getMethodName() + " test successfully...");
}
public void onTestFailure(ITestResult result) {
System.out.println("*** Test execution " + result.getMethod().getMethodName() + " failed...");
/*WebDriver driver = (WebDriver) result.getTestContext().getAttribute("driver"); // accessing driver here
try {
String screenShot = ExtentManager.captureScreenShot(driver);
ExtentTestManager.getTest().addScreenCaptureFromPath(screenShot);
} catch (IOException ex) {
}
ExtentTestManager.getTest().log(Status.FAIL, "Test Failed");
ExtentTestManager.getTest().fail(result.getThrowable());
driver.quit();*/
}
public void onTestSkipped(ITestResult result) {
System.out.println("*** Test " + result.getMethod().getMethodName() + " skipped...");
ExtentTestManager.getTest().log(Status.SKIP, "Test Skipped");
}
public void onTestFailedButWithinSuccessPercentage(ITestResult result) {
System.out.println("*** Test failed but within percentage % " + result.getMethod().getMethodName());
}
Также вы можете обратиться по ссылке ниже для получения дополнительной информации. https://www.youtube.com/watch?v=8Gi6smxpU8g&list=PLUeDIlio4THEKL1t1tLBsyB6nsWAJMXOp&index=42