Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/396.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 带组的TestNG before方法_Java_Testng - Fatal编程技术网

Java 带组的TestNG before方法

Java 带组的TestNG before方法,java,testng,Java,Testng,我想知道@beforethod在群组中的用法。信中说: alwaysRun:如果设置为true,则无论该配置方法属于哪个组,都将运行该配置方法 因此,我有以下课程: public class BeforeTest { private static final Logger LOG = Logger.getLogger(BeforeTest.class); @BeforeMethod(groups = {"g1"}, alwaysRun = false) public void setUpG1()

我想知道
@beforethod
在群组中的用法。信中说:

alwaysRun:如果设置为true,则无论该配置方法属于哪个组,都将运行该配置方法

因此,我有以下课程:

public class BeforeTest {
private static final Logger LOG = Logger.getLogger(BeforeTest.class);
@BeforeMethod(groups = {"g1"}, alwaysRun = false)
public void setUpG1(){
    sleep();
    LOG.info("BeforeMethod G1");
}

@Test(groups = {"g1"})
public void g1Test(){
    sleep();
    LOG.info("g1Test()");
}

@BeforeMethod(groups = {"g2"}, alwaysRun = false)
public void setUpG2(){
    sleep();
    LOG.info("BeforeMethod G2");
}

@Test(groups = {"g2"})
public void g2Test(){
    sleep();
    LOG.info("g2Test()");
}


private void sleep(){
    try {
        Thread.sleep(500);
    } catch (InterruptedException e) {
        e.printStackTrace();
    }
}
}
哪些产出:

BeforeMethod G1
BeforeMethod G2
g1Test()
BeforeMethod G1
BeforeMethod G2
g2Test()
抛开我认为awaysRun默认为false这一事实不谈,有人能向我解释为什么在每次测试之前都调用这两个before方法,而不考虑组吗?类似于@Test(skipBeforeMethod=“setUpG1”)的东西也可以工作


我正在使用IntelliJ IDEA CE 10.5.2。我也用gradle 1.0-milestone-3运行了它。

您如何调用TestNG?你们有团队吗


如果不运行任何方法,则两个@before方法都将运行。如果您运行“g1”,则只有setupG1将运行,等等。

我建议不要使用alwaysRun=true,而是为配置方法创建一个特殊组(我们使用“config”),并用groups=“config”注释所有在*()之前和之后的方法

所有测试方法都可以用您喜欢的任何一组进行注释,例如“foo”和“bar”

然后,在跑步过程中,你会:

-Dgroups=config,foo

如果随后添加另一个组“newGroup”,则不必遍历所有配置方法并向其中添加“newGroup”,只需运行:

-Dgroups=config,newGroup
这使得组的管理更加容易

如果您(错误地?)运行了以下内容:

-Dgroups=config,nonExistingGroup

没有测试(也没有配置方法)会运行,因为您实际上没有为“不存在的组”注释任何测试,只有当存在需要运行这些配置方法的“匹配测试”时,配置方法才会运行。

这是因为
标志仅指示方法是否属于组。启用该组时,始终执行该组,即在所有测试方法之前执行,而不考虑测试方法所属的组。默认情况下,所有组都处于启用状态

如果希望仅对特定组的测试执行该方法,则需要指定
onlyForGroups

public class BeforeTest {

    private static final Logger LOG = Logger.getLogger(BeforeTest.class);

    @BeforeMethod(onlyForGroups = { "g1" })
    public void setUpG1() {
        sleep();
        LOG.info("BeforeMethod G1");
    }

    @Test(groups = { "g1" })
    public void g1Test() {
        sleep();
        LOG.info("g1Test()");
    }

    @BeforeMethod(onlyForGroups = { "g2" }, alwaysRun = false)
    public void setUpG2() {
        sleep();
        LOG.info("BeforeMethod G2");
    }

    @Test(groups = { "g2" })
    public void g2Test() {
        sleep();
        LOG.info("g2Test()");
    }

    private void sleep() {
        try {
            Thread.sleep(500);
        } catch (InterruptedException e) {
            e.printStackTrace();
        }
    }
}
输出是

BeforeMethod G1
g1Test()
BeforeMethod G2
g2Test()

我运行none,认为分组是一种过滤,因此具有特定组的beforeMethod只适用于具有相同组的测试。我想我错了。我需要做的是类似于此处的解决方案(),但该解决方案的问题是,如果有许多测试依赖于f1,则mResult不会重置。
BeforeMethod G1
g1Test()
BeforeMethod G2
g2Test()