Отчеты о экстентах: этапы тестирования объединяются в последнем тесте в отчетах о экстентах, при выполнении теста в параллельном режиме.

Шаги теста и журналы тестирования объединяются в один последний тест.

Отчет об объеме 3.2

Фактические отчеты Функция 1 журналы

введите описание изображения здесь

Журнал функции 2 [Имеются все шаги]

введите описание изображения здесь

Моя структура проекта

введите описание изображения здесь

HomePage.java

package pom;

import test.BaseTest;

public class HomePage extends BaseTest
{

    public void setClick()
    {
        test.pass("This test is pass which is in click of home page");

    }

    public void setName()
    {
        test.fail("This test is fail which is in set of home page");

    }

    public void select()
    {
        test.pass("This test is info which is in selct of home page");

    }
}

Test1.java

package test;

import org.testng.annotations.Test;

import pom.HomePage;

public class Test1 extends BaseTest
{

    @Test
    public void funtion1() 
    {
        HomePage hp = new HomePage();
        hp.setName();
        hp.setClick();
        hp.select();

        test.pass("Test is Passed! ins funtion 2");

    }
}

Test2.java


package test;

import org.testng.annotations.Test;

import pom.HomePage;

public class Test2 extends BaseTest
{
    @Test
    public void funtion2()
    {
        HomePage hp = new HomePage();
        hp.setClick();
        hp.select();

        test.pass("Test is Passed!");

    }
}


BaseTest.Java

package test;
import java.lang.reflect.Method;

import org.testng.ITestResult;
import org.testng.annotations.AfterMethod;
import org.testng.annotations.AfterSuite;
import org.testng.annotations.BeforeMethod;
import org.testng.annotations.BeforeSuite;



import com.aventstack.extentreports.ExtentReports;
import com.aventstack.extentreports.ExtentTest;
import com.aventstack.extentreports.Status;
import com.aventstack.extentreports.markuputils.ExtentColor;
import com.aventstack.extentreports.markuputils.MarkupHelper;
import com.aventstack.extentreports.reporter.ExtentHtmlReporter;
import com.aventstack.extentreports.reporter.configuration.ChartLocation;
import com.aventstack.extentreports.reporter.configuration.Theme;

public class BaseTest
{
    public static ExtentHtmlReporter htmlReporter;
    public static ExtentReports extent;
    public static ExtentTest test;

    @BeforeSuite
    public void setUp()
    {
        htmlReporter = new ExtentHtmlReporter("./Reports/MyOwnReport.html");
        extent = new ExtentReports();
        extent.attachReporter(htmlReporter);

        extent.setSystemInfo("OS", "Mac Sierra");
        extent.setSystemInfo("Host Name", "Jayshreekant");
        extent.setSystemInfo("Environment", "QA");
        extent.setSystemInfo("User Name", "Jayshreekant S");

        htmlReporter.config().setChartVisibilityOnOpen(false);
        htmlReporter.config().setDocumentTitle("AutomationTesting.in Demo Report");
        htmlReporter.config().setReportName("My Own Report");
        htmlReporter.config().setTestViewChartLocation(ChartLocation.TOP);
        //htmlReporter.config().setTheme(Theme.DARK);
        htmlReporter.config().setTheme(Theme.STANDARD);
    }

    @BeforeMethod
    public void startTest(Method m)
    {
        test = extent.createTest(m.getName(),"This is the description of Test" + m.getName());

    }


    @AfterMethod
    public void getResult(ITestResult result)
    {
        if(result.getStatus() == ITestResult.FAILURE)
        {
            test.log(Status.FAIL, MarkupHelper.createLabel(result.getName()+" Test case FAILED due to below issues:", ExtentColor.RED));
            test.fail(result.getThrowable());
        }
        else if(result.getStatus() == ITestResult.SUCCESS)
        {
            test.log(Status.PASS, MarkupHelper.createLabel(result.getName()+" Test Case PASSED", ExtentColor.GREEN));
        }
        else
        {
            test.log(Status.SKIP, MarkupHelper.createLabel(result.getName()+" Test Case SKIPPED", ExtentColor.ORANGE));
            test.skip(result.getThrowable());
        }
    }

    @AfterSuite
    public void tearDown()
    {
        extent.flush();
    }
}

testngall.xml

<suite name="Suite" parallel="tests">
    <test name="Test 1 ">
        <classes>
            <class name="test.Test1" />
        </classes>
    </test>
    <test name="Test 2">
        <classes>
            <class name="test.Test2" />
        </classes>
    </test>
</suite> <!-- Suite -->

Итак, это вся структура кода проекта, я получаю журналы, добавляемые в последнем тесте.


person Jayshrikant Shrivastava    schedule 03.06.2019    source источник
comment
Не могли бы вы оставить свои ценные комментарии? @Anshoo   -  person Jayshrikant Shrivastava    schedule 03.06.2019
comment
ваши тесты не являются потокобезопасными. У вас есть переменная экземпляра класса ThreadLocal. что-то вроде этого, частный статический ThreadLocal ‹ExtentTest› test = new InheritableThreadLocal ‹› ();   -  person Sureshmani Kalirajan    schedule 24.06.2019


Ответы (3)


Это твоя проблема:

public static ExtentTest test;

Поскольку это статично, существует только один его экземпляр. Когда вы запускаете тесты параллельно, этот @BeforeMethod вызывается дважды.

@BeforeMethod
public void startTest(Method m)
{
    test = extent.createTest(m.getName(),"This is the description of Test" + m.getName());

}

Второй раз он называется первым тестом, вероятно, еще не завершен, но он все еще ссылается на тестовый объект, поэтому вы получите результат второго теста и некоторых частей первого теста, которые не были завершены в момент @BeforeMethod назывался. Вам нужно будет переписать свой код, чтобы не использовать статический объект test.

person Ardesco    schedule 03.06.2019
comment
Если вы удалите ключевое слово static, оно выбрасывает исключение NullPointerException в HomePage.java в строке test.pass("This test is pass which is in click of home page");. Это тоже не сработало. - person Jayshrikant Shrivastava; 03.06.2019
comment
Это базовая функциональность TestNG. Методы базового класса будут выполняться каждый раз, когда вы выполняете тесты. Отдельного экземпляра не требуется. Экземпляр beforemethod будет каждый раз создавать новый тестовый экземпляр. Вот как работают отчеты о степени. - person Jayshrikant Shrivastava; 03.06.2019
comment
TestNG - это не Magic, он не может создавать несколько экземпляров объектов, которые определены как один объект в вашем базовом классе. - person Ardesco; 03.06.2019
comment
Да, если вы поместите код в аннотацию до, он будет создан во время выполнения. - person Jayshrikant Shrivastava; 03.06.2019
comment
Он будет назначать объекту что-то новое каждый раз при вызове аннотации @BeforeMethod или @BeforeClass. Он категорически не будет создавать несколько экземпляров статического объекта. - person Ardesco; 03.06.2019
comment
Есть ли у вас альтернатива для этого? @Ardesco - person Jayshrikant Shrivastava; 03.06.2019

Чтобы обеспечить потокобезопасность параллельного выполнения, ExtentTest должен использовать переменную экземпляра класса ThreadLocal. пытаться,

private static ThreadLocal<ExtentTest> test = new InheritableThreadLocal<>();
person Sureshmani Kalirajan    schedule 24.06.2019

В классе, в котором вы создаете тесты, вы можете сделать его дочерним классом класса, в котором вы определяете классы и переменные отчета экстента. Теперь в дочернем классе (имеющем тесты) вы можете создать несколько экземпляров Extent Test.

Так что создавайте новый экземпляр для каждого нового теста

person Raghav    schedule 27.06.2019