为了账号安全,请及时绑定邮箱和手机立即绑定

跳过 @beforeMethod 中 testMethod 的执行,而不是全部跳过剩余的

跳过 @beforeMethod 中 testMethod 的执行,而不是全部跳过剩余的

胡说叔叔 2023-09-27 16:36:13
我有一个项目,在每个 @Test 方法之前,我都会检查该方法的注释数据是否有效。如果数据无效,我想跳过测试方法并继续测试套件的其余部分。所有数据解析和逻辑都工作正常,但据我所知,我使用了错误的工具来完成这项工作。我的代码有...private SoftAssert s_assert = new SoftAssert();@BeforeMethodpublic 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}在这种情况下,我想开始尝试同时执行这两个操作,但是当测试运行时 Test1() 应该被跳过,而 testng 应该继续运行 Test2()。然而,一旦我在 Test1() 处发现失败,它就会在 Test1() 处结束整个套件。不仅跳过 Test1(),还跳过 Test2()。我已经尝试过软断言和普通断言,但似乎都不起作用。
查看完整描述

3 回答

?
郎朗坤

TA贡献1921条经验 获得超9个赞

我希望跳过当前测试而不是所有剩余测试的问题仍然存在。


结果发现问题出在 Testng 中的 configfailurepolicy 上。当我希望将其设置为继续(继续套件的其余部分)时,它默认为跳过(跳过所有剩余的测试)。


这是我在其他地方找到的答案,我设法以两种不同的方式应用它。链接在这里


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\6.14.3”。


然后打开 .jar 存档,查看文件“testng-1.0.dtd”,找到该行


configfailurepolicy (skip | continue) "skip"

并将其更改为


configfailurepolicy (skip | continue) "continue"

之后应该可以正常工作。


编辑:正如评论中提到的,建议使用第一个解决方案,因为它允许这些更改/修复可以跨多个项目/设备移植。第二种解决方案只会将修复应用于您的计算机。


查看完整回答
反对 回复 2023-09-27
?
拉莫斯之舞

TA贡献1820条经验 获得超10个赞

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");

    }

}

您还需要更改默认配置失败策略,以便即使跳过一个测试也可以运行其他测试。这是在套件级别完成的:


<?xml version="1.0" encoding="UTF-8"?>

<suite name="Suite" configfailurepolicy="continue">

...

</suite>

感谢@Kyle OP指出这个属性。


查看完整回答
反对 回复 2023-09-27
?
白猪掌柜的

TA贡献1893条经验 获得超10个赞

在BeforeMethod中创建一个静态Booleanflag,如果数据不正确,则只需将标志更改为true,然后在布尔为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();

}


查看完整回答
反对 回复 2023-09-27
  • 3 回答
  • 0 关注
  • 116 浏览

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信