测试。在@beforeMethod 中跳过 testMethod 的执行,而不是全部跳过剩余的 testMethods
Testng. Skip execution of testMethod in @beforeMethod instead of all skipping remaining testMethods
我有一个项目,在每个@Test 方法之前我都会检查该方法的注释数据是否有效。如果数据无效,我想跳过测试方法并继续我的测试套件的其余部分。
所有数据解析和逻辑工作正常,但据我所知,我使用了错误的工具。
我的代码有...
private SoftAssert s_assert = new SoftAssert();
@BeforeMethod
public void beforeMethod(Method m){
//reads code
if (dataNotCorrect)
s_assert.fail();
}
@Test @MyCustomAnnotation(data = incorrect)
public void Test1(){
//Do stuff
}
@Test @MyCustomAnnotation(data = correct)
public void Test2(){
//Do stuff
}
在这种情况下,我想开始尝试同时执行这两项操作,但是当测试 运行s Test1() 应该被跳过并且 testng 应该继续到 运行 Test2() 时。然而,一旦我在 Test1() 处发现失败,它就会在 Test1() 处结束整个套件。不仅跳过 Test1(),还跳过 Test2()。
我尝试了软断言和普通断言,但似乎都不起作用。
在 BeforeMethod 中创建一个静态 Booleanflag,如果数据不正确,则只需将标志更改为 true,在布尔值测试为真时,先将标志设置为 false,然后测试失败
示例代码
public static Boolean myflag=false;
@BeforeMethod
public void beforeMethod(Method m){
//reads code
if (dataNotCorrect)
myflag=true;
}
@Test @MyCustomAnnotation(data = incorrect)
public void Test1(){
if(myflag){
myflag=false;
s_assert.fail();
}
SkipException 就是您要找的。
在beforeMethod
中检查你的数据,如果不正确则抛出SkipException
。这将跳过测试。在这个完整而简单的示例中,test2
被跳过:
import org.testng.SkipException;
import org.testng.annotations.BeforeMethod;
import org.testng.annotations.Test;
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
import java.lang.reflect.Method;
public class TestA {
@Retention(RetentionPolicy.RUNTIME)
public @interface MyCustomAnnotation {
boolean dataCorrect();
}
@BeforeMethod
public void beforeMethod(Method m) {
if (!m.getAnnotation(MyCustomAnnotation.class).dataCorrect()) {
throw new SkipException("Invalid data");
}
}
@Test
@MyCustomAnnotation(dataCorrect = true)
public void test1() {
System.out.println("test1");
}
@Test
@MyCustomAnnotation(dataCorrect = false)
public void test2() {
System.out.println("test2");
}
}
另请参阅:How do I use TestNG SkipException?
您还需要更改默认的配置失败策略,让其他人测试 运行 即使一个被跳过。这是在套件级别完成的:
<?xml version="1.0" encoding="UTF-8"?>
<suite name="Suite" configfailurepolicy="continue">
...
</suite>
感谢@Kyle OP 指出此属性。
@Benoit 让我大部分时间用抛出 SkipException 替换我的断言。但我希望跳过当前测试而不是所有剩余测试的问题仍然存在。
原来问题出在Testng中的configfailurepolicy。当我希望将其设置为继续(继续套件的其余部分)时,它默认为跳过(跳过所有剩余的测试)。
这是我在其他地方找到的一个答案,我设法以两种不同的方式应用了它。 Link here
1。
首先,从那里进行 testng.xml 和 运行 测试。在套件名称旁边,添加标签 configfailurepolicy="continue"
下面是我的testng.xml
<?xml version="1.0" encoding="UTF-8"?>
<suite name="Suite" configfailurepolicy="continue">
<test name="MyTests" preserve-order="true">
<classes>
<class name="testclassLocation..." />
</classes>
</test>
</suite>
确保你 运行 你的测试来自 testng.xml 如果你这样做的话。
2。
找到 testng 的 .jar 所在的位置。我正在使用 Maven,所以它是 "${user.dir}.m2\repository\org\testng\testng.14.3".
然后打开.jar 存档,查看文件'testng-1.0.dtd',找到行
configfailurepolicy (skip | continue) "skip"
并将其更改为
configfailurepolicy (skip | continue) "continue"
之后应该可以正常工作了。
编辑:
正如评论中提到的,建议使用第一种解决方案,因为它允许这些 changes/fixes 可以跨多个 projects/devices 移植。第二种解决方案只会将修复应用到您的机器。
我有一个项目,在每个@Test 方法之前我都会检查该方法的注释数据是否有效。如果数据无效,我想跳过测试方法并继续我的测试套件的其余部分。
所有数据解析和逻辑工作正常,但据我所知,我使用了错误的工具。
我的代码有...
private SoftAssert s_assert = new SoftAssert();
@BeforeMethod
public void beforeMethod(Method m){
//reads code
if (dataNotCorrect)
s_assert.fail();
}
@Test @MyCustomAnnotation(data = incorrect)
public void Test1(){
//Do stuff
}
@Test @MyCustomAnnotation(data = correct)
public void Test2(){
//Do stuff
}
在这种情况下,我想开始尝试同时执行这两项操作,但是当测试 运行s Test1() 应该被跳过并且 testng 应该继续到 运行 Test2() 时。然而,一旦我在 Test1() 处发现失败,它就会在 Test1() 处结束整个套件。不仅跳过 Test1(),还跳过 Test2()。
我尝试了软断言和普通断言,但似乎都不起作用。
在 BeforeMethod 中创建一个静态 Booleanflag,如果数据不正确,则只需将标志更改为 true,在布尔值测试为真时,先将标志设置为 false,然后测试失败
示例代码
public static Boolean myflag=false;
@BeforeMethod
public void beforeMethod(Method m){
//reads code
if (dataNotCorrect)
myflag=true;
}
@Test @MyCustomAnnotation(data = incorrect)
public void Test1(){
if(myflag){
myflag=false;
s_assert.fail();
}
SkipException 就是您要找的。
在beforeMethod
中检查你的数据,如果不正确则抛出SkipException
。这将跳过测试。在这个完整而简单的示例中,test2
被跳过:
import org.testng.SkipException;
import org.testng.annotations.BeforeMethod;
import org.testng.annotations.Test;
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
import java.lang.reflect.Method;
public class TestA {
@Retention(RetentionPolicy.RUNTIME)
public @interface MyCustomAnnotation {
boolean dataCorrect();
}
@BeforeMethod
public void beforeMethod(Method m) {
if (!m.getAnnotation(MyCustomAnnotation.class).dataCorrect()) {
throw new SkipException("Invalid data");
}
}
@Test
@MyCustomAnnotation(dataCorrect = true)
public void test1() {
System.out.println("test1");
}
@Test
@MyCustomAnnotation(dataCorrect = false)
public void test2() {
System.out.println("test2");
}
}
另请参阅:How do I use TestNG SkipException?
您还需要更改默认的配置失败策略,让其他人测试 运行 即使一个被跳过。这是在套件级别完成的:
<?xml version="1.0" encoding="UTF-8"?>
<suite name="Suite" configfailurepolicy="continue">
...
</suite>
感谢@Kyle OP 指出此属性。
@Benoit 让我大部分时间用抛出 SkipException 替换我的断言。但我希望跳过当前测试而不是所有剩余测试的问题仍然存在。
原来问题出在Testng中的configfailurepolicy。当我希望将其设置为继续(继续套件的其余部分)时,它默认为跳过(跳过所有剩余的测试)。
这是我在其他地方找到的一个答案,我设法以两种不同的方式应用了它。 Link here
1。 首先,从那里进行 testng.xml 和 运行 测试。在套件名称旁边,添加标签 configfailurepolicy="continue" 下面是我的testng.xml
<?xml version="1.0" encoding="UTF-8"?>
<suite name="Suite" configfailurepolicy="continue">
<test name="MyTests" preserve-order="true">
<classes>
<class name="testclassLocation..." />
</classes>
</test>
</suite>
确保你 运行 你的测试来自 testng.xml 如果你这样做的话。
2。 找到 testng 的 .jar 所在的位置。我正在使用 Maven,所以它是 "${user.dir}.m2\repository\org\testng\testng.14.3".
然后打开.jar 存档,查看文件'testng-1.0.dtd',找到行
configfailurepolicy (skip | continue) "skip"
并将其更改为
configfailurepolicy (skip | continue) "continue"
之后应该可以正常工作了。
编辑: 正如评论中提到的,建议使用第一种解决方案,因为它允许这些 changes/fixes 可以跨多个 projects/devices 移植。第二种解决方案只会将修复应用到您的机器。