繁体   English   中英

所有测试套件的TestNG运行方法一次

[英]TestNG run method once for all test suite

//deleted, see a refactoring at Update section.

我有编写示例的这段代码。 @BeforeClass批注出现时,它将值设置为我期望的值,并且继承的TestsOther类将正确打印该值。 但是它每次都运行testInit方法,一次用于SomeTest ,一次用于OtherTest

因此,我想做的显而易见的事情是将其更改为@BeforeTest批注,因此它将在所有测试之前仅对该方法进行一次评估,但随后继承的TestsOther类将为null

有人可以向我解释为什么它会为null以及使testInit方法对所有套件仅运行一次的正确方法是什么。

谢谢。

更新:为了更加清楚,我对代码进行了一些重构。

    public class TestsInit {

    protected String value;

    @BeforeClass
    public void testInit(){
        System.out.println("Entered testInit in TestsInit class,to set the value.");
        value="Something";
    }

    @Test
    public void SomeTest(){
        boolean isTrue=true;
        System.out.println("Entered SomeTest in TestsInit class.");
        Assert.assertTrue(isTrue);
    }
}

public class TestsOther extends TestsInit {

    @Test(dependsOnMethods = {"SomeTest"})
    public void OtherTest(){
        System.out.println("Entered OtherTest test in TestsOther class with value: "+value);
    }
}

我得到的输出是:

Entered testInit in TestsInit class,to set the value.
Entered SomeTest in TestsInit class.
Entered testInit in TestsInit class,to set the value.
Entered SomeTest in TestsInit class.
Entered OtherTest test in TestsOther class with value: Something

我想看起来像这样:

Entered testInit in TestsInit class,to set the value.
Entered SomeTest in TestsInit class.
Entered OtherTest test in TestsOther class with value: Something

因此,它将仅运行一次testInit方法,并在TestsOther测试之前运行SomeTest测试一次。 我需要将值存储在父类中,以便所有孩子都可以使用它。 我只需要运行一次testInit,也只需运行一次SomeTest测试。

有什么建议么?

这是您的问题的答案:

我已经采用了自己的代码,如下所示:

TestsInit类:

package Q45436872;

import org.testng.Assert;
import org.testng.annotations.BeforeClass;
import org.testng.annotations.Test;

public class TestsInit 
{

    protected String value;

    @BeforeClass
    public void testInit(){
    System.out.println("Entered testInit in TestsInit class,to set the value.");
    value="Something";
    }

    @Test
    public void SomeTest(){
    boolean isTrue=true;
    System.out.println("Entered SomeTest in TestsInit class.");
    Assert.assertTrue(isTrue);
    }
}

TestsOther类别:

package Q45436872;

import org.testng.annotations.Test;

public class TestsOther  extends TestsInit
{

    @Test (dependsOnMethods = {"SomeTest"})
    public void OtherTest(){
    System.out.println("Entered OtherTest test in TestsOther class with value: "+value);
    }
}

testng.xml

 <?xml version="1.0" encoding="UTF-8"?> <!DOCTYPE suite SYSTEM "http://testng.org/testng-1.0.dtd"> <suite name="Suite"> <test name="Test"> <classes> <class name="Q45436872.TestsInit"/> <class name="Q45436872.TestsOther"/> </classes> </test> <!-- Test --> </suite> <!-- Suite --> 

现在,当我以TestNG Suite运行此安装程序时,确实得到以下结果:

Entered testInit in TestsInit class,to set the value.
Entered SomeTest in TestsInit class.
Entered testInit in TestsInit class,to set the value.
Entered SomeTest in TestsInit class.
Entered OtherTest test in TestsOther class with value: Something

===============================================
Suite
Total tests run: 3, Failures: 0, Skips: 0
===============================================

我认为直到这里我们都在同一页上。

需求:

现在,您的要求似乎是:

  1. 仅运行一次testInit方法。
  2. SomeTest测试之前运行一次TestsOther测试

解:

作为解决方案,我只是注释了TestsInit类的强制执行。 所以我更新的testng.xml如下:

 <?xml version="1.0" encoding="UTF-8"?> <!DOCTYPE suite SYSTEM "http://testng.org/testng-1.0.dtd"> <suite name="Suite"> <test name="Test"> <classes> <!-- <class name="Q45436872.TestsInit"/> --> <class name="Q45436872.TestsOther"/> </classes> </test> <!-- Test --> </suite> <!-- Suite --> 

所以现在我只执行TestsOther类。 TestsOtherextends TestsInit 因此,由于testInit()@BeforeClass批注中,因此该方法将首先执行。

接下来,将执行@Test批注下的SomeTest() ,它符合您的要求。

最后,将执行TestsOther Class的@Test注释下的OtherTest()方法(被标记为(dependsOnMethods = {"SomeTest"}) ),这再次符合您的要求。

我的控制台上的输出是:

Entered testInit in TestsInit class,to set the value.
Entered SomeTest in TestsInit class.
Entered OtherTest test in TestsOther class with value: Something

此输出完全符合您的要求。

让我知道这是否回答了您的问题。

这两个类都有测试,因此它们都是测试类,@ @BeforeClass将按类运行一次。 使用@BeforeTest ,您会看到null因为您有2个实例,但仅在1个实例上调用该方法(另一个实例将具有null值)。

如果只想调用一个不带null的方法,则需要存储并从ITestContext查找值。

@BeforeTest
public void testInit(ITestContext context) {
    context.setAttribute("value", "Something");
}

@Test(dependsOnMethods = {"SomeTest"})
public void OtherTest() {
    System.out.println(context.getAttribute("value"));
}

添加一个解释静态变量用法的示例

public class TestsInit {
    protected String value;
    private static boolean initialised = false;

    @BeforeClass
    public void testInit() {
        synchronized (TestsInit.class) {
            if (initialised) {
                return;
            }
            System.out.println("Entered testInit in TestsInit class,to set the value.");
            value = "Something";
            initialised = true;
        }
    }

    @Test
    public void SomeTest() {
        boolean isTrue = true;
        System.out.println("Entered SomeTest in TestsInit class.");
        Assert.assertTrue(isTrue);
    }
}

由于@BeforeClass按类运行一次,因此您的方案中有两个类,因此它将运行两次。

使用@BeforeClass注释输出

Entered testInit in TestsInit class,to set the value.
Entered SomeTest in TestsInit class.
Entered OtherTest test in TestsOther class with value: Something
Entered testInit in TestsInit class,to set the value.
Entered SomeTest in TestsInit class.
PASSED: SomeTest
PASSED: OtherTest
PASSED: SomeTest

===============================================
    Default test
    Tests run: 3, Failures: 0, Skips: 0
===============================================


===============================================
Default suite
Total tests run: 3, Failures: 0, Skips: 0
===============================================

如果只想运行一次TestsInit ,则将@BeforeClass替换为@BeforeSuite

使用@BeforeSuite注释输出

Entered testInit in TestsInit class,to set the value.
Entered SomeTest in TestsInit class.
Entered OtherTest test in TestsOther class with value: Something
Entered SomeTest in TestsInit class.
PASSED: SomeTest
PASSED: OtherTest
PASSED: SomeTest

===============================================
    Default test
    Tests run: 3, Failures: 0, Skips: 0
===============================================


===============================================
Default suite
Total tests run: 3, Failures: 0, Skips: 0
===============================================

注意SomeTest运行了两次,这是因为TestsOther是另一个类,它扩展了TestsInit类,并且它只有一个方法依赖于SomeTest测试用例。

希望这会有所帮助。

要对所有类仅执行一次testInit方法,请尝试在单独的抽象类中进行初始化,并在需要时使用该类扩展其他类。

如果您收到这样的输出

东西

通过:SomeTest

通过:OtherTest

据了解,父类的@Test将在当前子类的@Test之前运行。 因为两个类中都有@Test ,所以在每个类中都将执行@Test并在控制台上打印。

使用@BeforeTest批注,它也可以正常工作。(这意味着我没有在此更改上得到null

如果在此建议的解决方案之后仍然为空,可以请您分享更多代码。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM