org.testng.TestNGException:通过TestNG执行测试时,以下方法具有循环依赖性

时间:2018-08-23 17:32:47

标签: annotations dependencies testng circular-dependency

Testng异常显示循环依赖关系,请说明

package test.depends;
import org.testng.annotations.Test
public class SimpleDependencyTes {
@Test
public void testOne() {
    System.out.println("The first method");
}
@Test(dependsOnMethods= {"testOne","testTwo"})
public void testTwo() {
    System.out.println("The Second method");
}
}

错误如下:

org.testng.TestNGException: The following methods have cyclic dependencies:SimpleDependencyTes.testTwo()[pri:0, instance:test.depends.SimpleDependencyTes@1774679]
at org.testng.internal.Graph.topologicalSort(Graph.java:149)
at org.testng.internal.MethodHelper.topologicalSort(MethodHelper.java:261)
at org.testng.internal.MethodHelper.sortMethods(MethodHelper.java:317)
at org.testng.internal.MethodHelper.collectAndOrderMethods(MethodHelper.java:64)
at org.testng.TestRunner.initMethods(TestRunner.java:438)
at org.testng.TestRunner.init(TestRunner.java:271)
at org.testng.TestRunner.init(TestRunner.java:241)
at org.testng.TestRunner.<init>(TestRunner.java:192)
at org.testng.remote.support.RemoteTestNG6_12$1.newTestRunner(RemoteTestNG6_12.java:33)
at org.testng.remote.support.RemoteTestNG6_12$DelegatingTestRunnerFactory.newTestRunner(RemoteTestNG6_12.java:66)
at org.testng.SuiteRunner$ProxyTestRunnerFactory.newTestRunner(SuiteRunner.java:713)
at org.testng.SuiteRunner.init(SuiteRunner.java:260)
at org.testng.SuiteRunner.<init>(SuiteRunner.java:198)
at org.testng.TestNG.createSuiteRunner(TestNG.java:1295)
at org.testng.TestNG.createSuiteRunners(TestNG.java:1273)
at org.testng.TestNG.runSuitesLocally(TestNG.java:1128)
at org.testng.TestNG.runSuites(TestNG.java:1049)
at org.testng.TestNG.run(TestNG.java:1017)
at org.testng.remote.AbstractRemoteTestNG.run(AbstractRemoteTestNG.java:114)
at org.testng.remote.RemoteTestNG.initAndRun(RemoteTestNG.java:251)
at org.testng.remote.RemoteTestNG.main(RemoteTestNG.java:77)

3 个答案:

答案 0 :(得分:1)

您的testTwo将其自身列为依赖项:

@Test(dependsOnMethods= {"testOne","testTwo"})
public void testTwo() {

按定义dependsOnMethods表示

  

(testTwo)仅在成功执行所有依赖的测试之后才开始执行

source)。因此,如果您按照上面的引用设置了testTwo,则是说testTwo在成功执行testTwo之后才能启动。这是不可能的。相反,您可能只想让testTwo依赖于testOne

@Test(dependsOnMethods= {"testOne"})
public void testTwo() {

和其他一些testThree可以同时依赖于两者:

@Test(dependsOnMethods= {"testOne","testTwo"})
public void testThree() {

答案 1 :(得分:0)

循环依赖

Circular dependency是两个或多个模块之间的关系,这些模块直接或间接依赖于彼此才能正常运行。这样的模块也称为mutually recursive

循环依赖可能在以下两种情况下发生:

  • 方法testOne()引用了另一种方法testTwo(),同时testTwo()试图引用testOne()
  • 方法testTwo()试图引用自身,即testTwo()

在这里您可以找到有关What is a circular dependency and how can I solve it?的详细讨论


dependsOnMethods

dependsOnMethods用于创建此方法所依赖的方法的 List


带有@Test批注的dependsOnMethods

有两种依赖关系:

  • 硬依赖性:您依赖的所有方法都必须已经运行并且成功运行。如果您的依赖项中至少发生了一次失败,则该方法将不会被调用并在报告中标记为SKIP。
  • 软件依赖项:即使某些方法失败,该方法也始终在您依赖的方法之后运行。当您只想确保测试方法以特定顺序运行但它们的成功并不真正取决于其他方法的成功时,这将非常有用。通过在您的"alwaysRun=true"批注中添加@Test获得软依赖性。

  • 一个例子:

    @Test
    public void initial_test_method() {}
    
    @Test(dependsOnMethods = { "serverStartedOk" })
    public void test_method1() {}
    

    在此示例中,test_method1()被声明为依赖于方法initial_test_method(),这保证了initial_test_method()将始终首先被调用。


出了什么问题

在您的程序中,@Test的{​​{1}}注释包含testTwo()(本身)作为 dependsOnMethods 之一。因此,您会看到错误。


解决方案

如果从 dependsOnMethods List 中删除方法testTwo(),则您的程序将是完美的。

testTwo()

答案 2 :(得分:-1)

您已经定义了对两种方法的依赖关系:testOne和testTwo,其中testTwo本身,但这并不意味着。您不能在方法本身上定义依赖关系。您可以定义对任何其他方法的依赖。因此,您需要删除testTwo依赖性。

@Test(dependsOnMethods= {"testOne"})
public void testTwo() {
    System.out.println("The Second method");
}

您可以为任何第三个@Test方法定义这两个依赖关系,例如:

@Test(dependsOnMethods= {"testOne","testTwo"})
public void testThree() {
    System.out.println("The third method");
}