6

我的班级有很多方法,当我运行代码时,方法是随机调用的,但是在我的班级中,每个方法都依赖于它的前身,即第二种方法取决于第一种方法,第三种方法取决于第二种方法,依此类推.我想按顺序执行所有方法

我已经尝试了以下方法并测试了代码,但这些方法仍然是随机调用的

//using sequential
@Test(sequential = true)
public void Method1(){
}


@Test(sequential = true)
public void Method2(){
}

//using singleThreaded 
@Test(singleThreaded=true)
public void Method1(){
}


@Test(singleThreaded=true)
public void Method2(){
}

我也在testng中传递了以下参数

<test name="Test" preserve-order="true" annotations="JDK">
 <classes>
 <class name="com.test" >
 <methods>
 <include name="method1"/>
 <include name="method2"/>
 <include name="method3"/>...
 </methods>
 </class>
  </classes>

 </test>

 </suite>

当我用 测试它时@Test(dependsOnMethod=""),不是按顺序执行这些方法,而是跳过了这些方法。

如何在testng中顺序执行测试?

4

7 回答 7

6

如果您想以某种特定方式运行所有测试方法,则不仅仅是在@test注释中添加优先级。见以下:-

@test(priority=0)

function1()
{}

@test(priority=1)

function2()

{}


@test(priority=5)

function3()

{}

@test(priority=3)

function4()

{}

@test(priority=2)

function5()

{}

在这种情况下,函数 1 先于函数 2 调用,由于优先级,函数 5 将在函数 5 之后调用而不是函数 3。

于 2013-10-04T13:57:33.730 回答
2

如果依赖的方法失败,Dependsonmethods 将使您的测试跳过。这在逻辑上是正确的,因为如果 testB 依赖于 testA,那么如果 testA 失败,那么运行 testB 就没有用了。如果您只需要在 testA 之后运行 testB 并且 testB 不依赖于 testA 的结果,那么将 alwaysrun=true 添加到您的 @test 注释中。这些被称为。软依赖。参考这里

于 2013-10-03T15:51:22.103 回答
2

首先,您不需要sequentialorsingleThreaded参数。在套件中编写单个方法就是您所需要的。您的问题可能出在其他地方。确保您使用套件而不是课程本身开始测试。

如果您不想每次都使用套件(因为它很乏味、容易出错且不灵活),这里有一些解决此问题的方法。

  1. 将依赖的方法合二为一,过度使用Reporter.log(String, boolean). 这类似于System.out.println(String),但也将字符串保存到 TestNG 报告。对于第二个参数,您总是希望传递 true - 它告诉您是否也应该将消息打印到 STDOUT。在每个步骤之前执行此操作时,仅测试输出就足以识别有问题(读取失败)的测试步骤。

    此外,在执行此操作时,您可以使用软断言。这基本上意味着您不必仅仅因为一个可选步骤不起作用而中止和失败整个测试。您可以继续直到下一个关键点,然后或在最后中止。错误仍将被保存,您可以决定是否要将测试运行标记为失败或不稳定。

  2. @Test(priority = X)在 X 是数字的地方使用。用优先级标记所有测试方法,它们将按照优先级编号从低到高的顺序执行。这样做的好处是您可以在步骤之间放置方法,并且单个注释是独立的。然而,缺点是这不会强制任何硬依赖,而只会强制执行顺序。即如果优先级=1 的方法testA 失败,那么优先级=2 的方法testB 仍然会被执行。

    不过,您可能可以使用侦听器解决此问题。这个还没试过。

  3. 使用@Test(dependsOnMethods = {"testA"}). 请注意,这里的参数不是字符串,而是字符串列表(您的帖子中有错误)。好处是硬依赖,这意味着当 testB 依赖于 testA 时, testA 的失败会将 testB 标记为已跳过。此注释的缺点是您必须将所有方法放在一个非常严格的链中,其中每个方法都依赖于另一个方法。如果你打破这个链条,例如有多个方法不依赖于任何东西,或者有一些方法依赖于相同的方法,你就会进入地狱厨房......

不幸的是,同时使用 priority 和 dependsOnMethods 并不能达到预期的效果。使用硬依赖时,优先级通常会被忽略。

于 2015-10-13T11:27:14.157 回答
0

您可以使用带有侦听器的@Priority 来控制执行。请参阅此链接 - http://beust.com/weblog/2008/03/29/test-method-priorities-in-testng/

于 2013-10-03T10:36:17.527 回答
0

尝试使用dependsOnMethods来自 TestNG 框架的依赖项。

于 2015-03-11T09:35:16.787 回答
0

这是一个糟糕的测试逻辑。作为一名经验丰富的专业软件测试工程师。我建议你立即摆脱你所走的这条自动化道路。

好的测试架构要求每个方法都是自给自足的,并且在继续之前不应该依赖其他测试来完成。为什么?因为说测试 2 依赖于测试 1。说测试 1 失败..现在测试 2 将失败..最终,您将测试 1、2、3、4、5 测试失败,您甚至不知道是什么原因是。

先生,我对您的建议是创建自给自足、可维护且简短的测试。

这是一本很棒的读物,可以帮助您的努力: http ://www.lw-tech.com/q1/ug_concepts.htm

于 2013-10-03T16:26:52.637 回答
0

根据您的注释,我假设您正在使用 TestNG。我在这里同意其他人的观点,即“顺序”不是要走的路。

选项 1:dependsOnMethods

如果您的意图是在上游依赖项失败时甚至不尝试下游方法,请尝试使用 dependsOnMethods 。使用此设置,如果较早的测试失败,则会跳过进一步的测试(而不是失败)。

像这样:

// using dependsOnMethods
@Test
public void method1(){
    // this one passes
}

@Test(dependsOnMethods = {"method1"})
public void method2(){
    fail("assume this one fails");
}

@Test(dependsOnMethods = {"method1"})
public void method3(){
    // this one runs, since it depends on method1
}

@Test(dependsOnMethods = {"method2"})
public void method4(){
    // this one is skipped, since it depends on method2
}

选项 2:优先级

如果您的意图是执行所有测试,无论上游测试是否通过,您都可以使用优先级。

像这样:

其他注意事项

我完全同意 sircapsalot 的观点,即测试应该是小而独立的。如果您使用了很多依赖项,那么您的整体测试框架可能存在问题。

也就是说,有些测试需要先运行,有些测试需要最后运行,等等。有些情况下,如果其他测试失败,则应该跳过测试。例如,如果您有测试“updateOneRecord”和“updateManyRecords”,如果其中一个不起作用,您可以在逻辑上跳过多个。

(最后一点,您的方法名称应以小写字符开头。)

于 2016-05-11T16:12:35.963 回答