TestNG - 无法在套件中运行两次相同的测试

时间:2014-07-16 01:07:05

标签: java testng

我有一个TestNG测试套件工作正常,除了一件事:我不能运行两次相同的测试。我想要运行两次测试的原因是我正在测试用户登录/注销的Web服务,我想验证登录是否有效,然后注销工作,然后再次登录以便后续需要用户登录的测试才能继续。

以下是我的testng.xml的相关部分:

<suite name="WebServiceTestSuite">
    <test name="webServiceTest" verbose="10" parallel="none">
        <classes>
            <class name="com.abcco.webservice.DivisionTest">
                <methods>
                    <include name="registrationCreateTest"></include>
                    <include name="registrationActivateTest"></include>
                    <include name="appUserLoginTest"></include>
                    <include name="appUserLogoutTest"></include>
                    <include name="appUserLoginTest"></include>
                    <include name="sessionValidateTest"></include>
                    <include name="sessionExtendTest"></include>
                </methods>
            </class>
        </classes>
    </test>
</suite>

如您所见,“appUserLoginTest”被调用两次。但是,当我调试它时,我可以清楚地看到它实际上只是在第一次调用时运行。之后执行继续进行,就好像调用它的第二行不存在一样。

2 个答案:

答案 0 :(得分:1)

这实际上是在TestNG中设计的。我看到两个可能的选择:

首先,看看在测试中使用DataProvider,以便可以使用不同的参数重复执行它们。

或者,更改XML布局,以便每个方法都是其自己的标记的一部分。在此配置中,XML将更长,但您可以根据需要多次调用测试方法作为套件的一部分。

编辑:现在有更多细节。

在回应您的评论时,这是一个示例XML布局,当我遇到同样的问题时,它对我有用。试试这个:

<suite name="WebServiceTestSuite">
<test name="webServiceTest">
    <classes>
        <class name="com.abcco.webservice.DivisionTest">
            <methods>
                <include name="registrationCreateTest"></include>
            </methods>
        </class>
    </classes>
</test>
<test name="webServiceTest">
    <classes>
        <class name="com.abcco.webservice.DivisionTest">
            <methods>
                <include name="registrationActivateTest"></include>
            </methods>
        </class>
    </classes>
</test>
<test name="webServiceTest">
    <classes>
        <class name="com.abcco.webservice.DivisionTest">
            <methods>
                <include name="appUserLoginTest"></include>
            </methods>
        </class>
    </classes>
</test>
<test name="webServiceTest">
    <classes>
        <class name="com.abcco.webservice.DivisionTest">
            <methods>
                <include name="appUserLogoutTest"></include>
            </methods>
        </class>
    </classes>
</test>
<test name="webServiceTest">
    <classes>
        <class name="com.abcco.webservice.DivisionTest">
            <methods>
                <include name="appUserLoginTest"></include>
            </methods>
        </class>
    </classes>
</test>
<test name="webServiceTest">
    <classes>
        <class name="com.abcco.webservice.DivisionTest">
            <methods>
                <include name="sessionValidateTest"></include>
            </methods>
        </class>
    </classes>
</test>
<test name="webServiceTest">
    <classes>
        <class name="com.abcco.webservice.DivisionTest">
            <methods>
                <include name="sessionExtendTest"></include>
            </methods>
        </class>
    </classes>
</test>
</suite>

我从verbose="10" parallel="none"代码中删除了<test>,因为适用于我的布局没有这个...您可以将verbose="10"添加到<suite> {{1}}标记,以获取您需要的任何特定功能。请放心使用并发布您的结果,我们将很乐意为您提供进一步的帮助。如果没有看到您的跑步者配置或对设置的其余部分了解太多,可能还需要考虑其他一些事项。

您会发现这是一个更冗长的XML布局,但它在当时为我解决了同样的问题。您还可以考虑重新安排代码并制作一个@Test方法,将该XML上的所有方法作为单个测试调用,从而可以减少XML文件的长度。

答案 1 :(得分:0)

解决TestNG测试中的代码重复问题,我只能找到以下解决方案:

创建一个rootsuite.xml文件,例如:

<suite name="Description">
<suite-files>
    <suite-file path="../../Actions/Test1.xml"/>
    <suite-file path="../../Actions/Test2.xml"/>
    <suite-file path="Actions/Test3.xml"/>
    <suite-file path="../../Common/Close Browser.xml"/>
</suite-files>

<suite-files>
    <suite-file path="../../Actions/Test1.xml"/>
    <suite-file path="../../Actions/Test2.xml"/>
    <suite-file path="Actions/Test4.xml"/>
    <suite-file path="../../Common/Close Browser.xml"/>
</suite-files>
</suite>

重要!您不能在Test1.xml,Test2.xml,Test3.xml,Test4.xml中包含重复的套件文件-所有重复的套件都将被忽略。

请注意,TestNG的版本必须至少为6.9.9

<dependency>
  <groupId>org.testng</groupId>
  <artifactId>testng</artifactId>
  <version>6.9.9</version>
  <scope>test</scope>
</dependency>