TestNG的属性dependsOnMethods不支持层次结构?

时间:2018-03-14 16:08:28

标签: selenium-webdriver automated-tests testng

我有3种测试方法,让我们来电话method1method2method3Method1可以单独执行。但method2取决于method1,这意味着method1准备method2继续工作的工作流程。在这方面,method3取决于method1method2

当然,我可以将所有三合一测试方法结合起来并且有效。但是因为我使用了TestNG,并且我发现了dependsOnMethods,所以我想尝试一下。这就是我将测试分解为3种方法的原因:

@Test
public void method1() {
    // do test steps        
}

@Test(dependsOnMethods = {"method1"})
public void method2() {
    // do test steps
}

@Test(dependsOnMethods = {"method2"})
public void method3() {
    // do test steps
}

method1成功执行。当我执行method2时,首先执行method1,然后执行method2。这就是我想要的。

这就是为什么我认为,如果我执行method3,那么method2将被执行,而method2依赖于method1,那么{{ 1}}应该先执行,所以按此顺序执行:method1。但它显然不起作用。我得到了method1 -> method2 -> method3

TestNGException

之后我试试这个:

method2() is depending on method1(), which is not annotated with @Test or not included

实际上,首先调用method1,因为我看到网页浏览器是用网址打开的,但是那个,它没有进一步,它停在那里,我得到这个日志:

@Test(dependsOnMethods = {"method1" , "method2"})
public void method3() {
    // do test steps
}

任何人都可以向我提出解释和解决方案。我的测试在Chrome上运行。谢谢你的阅读。

1 个答案:

答案 0 :(得分:0)

如果您想按特定顺序(method1->method2->method3)运行测试用例,请尝试以下解决方案。

  

Approach1

public class TestOrder {


    @Test
    public void method1() {
        System.out.println("method1");        
    }

    @Test(dependsOnMethods = {"method1"})
    public void method2() {
        System.out.println("method2");
    }

    @Test(dependsOnMethods = {"method2"})
    public void method3() {
        System.out.println("method3");
    }

}

,您的testng.xml文件结构就像这样

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE suite SYSTEM "http://testng.org/testng-1.0.dtd">
<suite name="Suite" preserve-order="true">
    <test thread-count="1" name="Test">
        <classes>
            <class name="grid.TestOrder"/>
        </classes>
    </test> <!-- Test -->
</suite> <!-- Suite -->

我正在得到这样的输出。

method1
method2
method3

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

Approach2

public class TestOrder {


    @Test
    public void method1() {
        System.out.println("method1");        
    }

    @Test
    public void method2() {
        System.out.println("method2");
    }

    @Test
    public void method3() {
        System.out.println("method3");
    }
}

您必须在testng.xml

中更改内容
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE suite SYSTEM "http://testng.org/testng-1.0.dtd">
<suite name="Suite" preserve-order="true">
    <test thread-count="1" name="Test">
        <classes>
            <class name="grid.TestOrder">
                <methods>
                    <include name="method1" />
                    <include name="method2" />
                    <include name="method3" />
                </methods>
            </class>
        </classes>
    </test> <!-- Test -->
</suite> <!-- Suite -->

这一次,我也得到了相同的输出

method1
method2
method3

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

method2()取决于method1(),它没有使用@Test注释   或不包括

因为您尝试单独运行method2而未提供依赖方法的详细信息。

您可能就是这样设计了xml文件。

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE suite SYSTEM "http://testng.org/testng-1.0.dtd">
<suite name="Suite" preserve-order="true">
    <test thread-count="1" name="Test">
        <classes>
            <class name="grid.TestOrder">
                <methods>
                    <include name="method2" />
                    <include name="method3" />
                </methods>
            </class>
        </classes>
    </test> <!-- Test -->
</suite> <!-- Suite -->

您应该在<classes>标记中包含所有方法或类名。您可以结帐this thread了解详情。

  

From Cedric Beust's answer(link source):<classes>标记是类和方法的列表   TestNG应该在它开始解析之前看一下,例如   要运行哪些组,依赖项是什么等等......所以要做的第一件事就是在testng.xml中包含整个类“