我正在尝试使用testng。我的目标是在几个类中使用测试方法,并在一个单独的类中“支持”方法来准备和汇总一堆测试。
另一个要求是在测试套件中必须为多个测试部件调用支持方法。例如。第一部分包含testA和testB,第二部分包含testC和testD。这将导致以下步骤:
support1,testA,testB,support2,support1,testC,testD,support2
我的第一种方法(部分)是使用@Test
注释所有方法,使用组并定义组之间的依赖关系,例如测试方法依赖于一组“setUp”,它是上例中一组支持方法“support1”。
这种方法的问题在于支持方法算作测试,因此生成的报告显示错误的“真实”测试数。
下一个想法是使用@BeforeGroups
和@AfterGroups
,将支持方法放在一个组中,并使用组依赖关系。支持方法不应再算作测试。但我一开始就陷入困境。
例如,我试过
@BeforeGroups (groups = {"setUp"})
用于课程Support
中的设置方法,以及
@Test(groups = { "TestA" }, dependsOnGroups = { "setUp" })
在“真正的”测试课程中。这导致以下(简单的)错误:
[testng] DependencyMap::Method "TestClass.testSomething()[...]" depends on nonexistent group "setUp"
为什么组“setUp”不存在?我忽视了什么吗?
还是有另一种方法可行吗?
感谢您的帮助!
修改 测试是从Ant开始的,我使用像这样的testng.xml:
<test name="TestA">
<groups>
<run>
<include name="setUp" />
<include name="TestA"/>
<include name="tearDown"/>
</run>
</groups>
<classes>
<class name="seleniumtest.test.technical.Support"/>
<class name="seleniumtest.test.business.TestClassA"/>
</classes>
</test>
<test name="TestB">
<groups>
<run>
<include name="setUp" />
<include name="TestB"/>
<include name="tearDown"/>
</run>
</groups>
<classes>
<class name="seleniumtest.test.technical.Support"/>
<class name="seleniumtest.test.business.TestClassB"/>
</classes>
</test>
答案 0 :(得分:4)
我得到了故障!!
问题在于注释
@Test(groups = { "TestA" }, dependsOnGroups = { "setUp" })
基本上你的错误信息是试图说没有@Test方法,groupname为setUp
!!提出您的问题,解决方案是修改测试方法的注释,如下所示
@Test(groups = { "TestA" })
并在支持方法中修改注释
@BeforeGroups (groups = {"TestA"})
我使用此设置运行了一个示例示例
public class TestSupport {
@BeforeGroups(groups = { "sample","sample1" })
public void beforeTest() {
System.out.println("Before test");
}
@AfterGroups(groups = { "sample","sample1" })
public void afterTest() {
System.out.println("after test");
}
}
以我的Test类为
public class TestClassA {
@Test(groups = { "sample" })
public void superTestA() {
System.out.println("This is the actual test");
}
@Test(groups = { "sample" })
public void superTestB() {
System.out.println("This is the another test under sample group");
}
@Test(groups = { "sample1" })
public void superTest() {
System.out.println("This is another test");
}
}
和我的testng.xml如下所示
<test name="sampletest" >
<groups>
<run>
<include name="sample" />
<include name="sample1" />
</run>
</groups>
<classes>
<class name="test.global.testng.TestClassA"/>
<class name="test.global.testng.TestSupport"/>
</classes>
</test>
现在,这就是测试的运行方式:beforeGroups-> superTestA/superTestB ->afterGroups
和beforeGroups-> superTest -> afterGroups
并关闭
答案 1 :(得分:2)
我想我已经提出了我想要的解决方案。
我需要使用的是支持类中@BeforeTest
和@AfterTest
而不是@BeforeGroups
和@AfterGroups
:
@BeforeTest(groups = {"setUp"})
public void beforeTest() {[...]}
@AfterTest( groups = {"tearDown"})
public void afterTest() {[...]}
在测试课程中:
@Test(groups = { "TestA" })
public void testSomething() {[...]}
dependsOnGroups
已经消失,就像巴顿的方法一样。
与我的问题相比,testng.xml没有变化。即可以在testng.xml文件中配置测试,而无需更改java代码。
此外,这个解决方案也摆脱了BeforeGroups方法的另一个问题,至少就像Patton所假设的那样(@Patton我不是故意冒犯你)。
对于后者,使用多个测试组的测试未按预期运行,因为beforeTest()
方法将在任何组之前运行。例如。如果你有以下测试(testng.xml的摘录):
<groups>
<run>
<include name="TestA"/>
<include name="TestB"/>
</run>
</groups>
......执行的执行步骤是:
beforeTest(),TestA,beforeTest(),TestB,afterTest()。
使用BeforeTest的解决方案,您将进行以下测试:
<groups>
<run>
<include name="setUp" />
<include name="TestA"/>
<include name="TestB"/>
<include name="tearDown"/>
</run>
</groups>
......执行的执行步骤是:
setUp = beforeTest(),TestA,TestB,tearDown = afterTest()。
答案 2 :(得分:0)
package com.test.MySample;
import org.testng.annotations.*;
public class TestNGTest1 {
@BeforeTest
public void BeforeTest() {
System.out.println("@BeforeTest");
}
@BeforeClass
public void BeforeClass() {
System.out.println("@BeforeClass");
}
@BeforeGroups (groups = {"My group"})
public void BeforeGroups() {
System.out.println("@BeforeGroups");
}
@BeforeGroups (groups = {"My group1"})
public void BeforeGroups1() {
System.out.println("@BeforeGroups1");
}
@AfterGroups (groups = {"My group1"})
public void AfterGroups1() {
System.out.println("@AfterGroups1");
}
@BeforeMethod
public void BeforeMethod() {
System.out.println("@BeforeMethod");
}
@Test(groups = {"My group"})
public void test1() {
System.out.println("test1");
}
@Test (groups = {"My group", "My group1"})
public void test2() {
System.out.println("test2");
}
@AfterMethod
public void AfterMethod() {
System.out.println("@AfterMethod");
}
@AfterGroups (groups = {"My group"})
public void AfterGroups() {
System.out.println("@AfterGroups");
}
@AfterClass
public void AfterClass() {
System.out.println("@AfterClass");
}
@AfterTest
public void AfterTest() {
System.out.println("@AfterTest");
}
}