2017-02-05 58 views
0

我已经尝试了很多方法,但都没有成功,我开始相信这在TestNG中是不可行的,我只是想和你确认一下。TestNG - 为了不可能的场景运行测试?

我有我正在测试的web服务,我需要运行一些基本的场景。



我的当前测试方法,每种具有@Test注解(每个需要是可测试的作为单一试验):

  • dbResetTest
  • clearCacheTest
  • openURLTest
  • loginTest
  • actionXTest
  • actionYTest



我还需要运行这些场景从上面包括运行测试顺序:

  1. 测试登录功能(openURLTest - >dbResetTest - >clearCacheTest - >loginTest
  2. 测试X登录后(openURLTest - >dbResetTest - >clearCacheTest - >loginTest - >actionXTest
  3. 测试清除缓存后的Y(clearCacheTest - >actionYTest



的问题是,如果我从1点& 2依赖他人做测试中,我将无法运行方案3,因为clearCacheTest没有在此特定情形依赖于任何其他。我试着通过xml和依赖关系运行这些测试,但没有成功。

当然,我可以让actionYTest调用clearCacheTest直接,但这时如果clearCacheTest失败的报告将显示,actionYTest是一个失败这是我尽量避免。

现在我敢肯定,我需要的是不TestNG中实现的,但也许我错了......

回答

0

我想你应该稍微改变自己的战术。而不是感知这些〜(dbResetTest等)作为测试类,您应该让它们测试方法,并以编程方式(而非XML)而不是dependsOnGroups使用dependsOnMethods。然后,您将能够轻松实现所需的逻辑(每个测试都是唯一的 - > @Test注释,每个测试都以特定优先级执行 - >使用优先级参数)。然后1,2,3测试应该是你的测试类。因此,这里是你怎么做:如果

public class LoginFeature { 

    @Test (priority=1) 
    public openURLTest(){ 
    } 

    @Test (priority=2, dependsOnMethods="openURLTest") 
    public dbResetTest(){ 
    } 


    @Test (priority=3, dependsOnMethods="dbResetTest") 
    public clearCacheTest(){ 
    } 

    @Test (priority=4, dependsOnMethods="clearCacheTest") 
    public loginTest(){ 
    } 



} 

这样的东西你的测试失败之间在会自动跳过的情景休息,你会不会需要直接调用clearCacheTest。

希望这会有所帮助!


更新

OP的评论

好后,我再次觉得你还挺有一个设计问题。为了让你的方法被多次调用,他们需要坐在他们可以访问的地方。你几乎在那里与你的方法,但不完全。所以这里是你如何调用方法。多次,都从头运行它们(我会先告诉你的代码,然后详细解释):

父类

public class TestBase{ 
    //include here all your important methods *without* @Test Annotation 

    public void dbReset(){ 
    //perform db reset 
    } 

    public void clearCache(){ 
    //clear browser cache 
    } 

    public boolean openURL(){ 
    //try to open test URL 
    return didIreachTestURLSuccessfully; 

    } 

} 

子类

public class loginFeature extends TestBase{ 


@Test (priority=1) 
public void attemptToResetDataBase(){ 

dbReset(); 
} 


@Test (priority=2, dependsOnMeth0ds="attemptToResetDataBase") 
public void clearCacheTest(){ 

clearCache(); 
} 


@Test (priority=3, dependsOnMeth0ds="clearCacheTest") 
public void verifySuccessfulLogin(){ 

login(); 
} 



} 

因此,您将所有测试方法都包含在名为TestBase的父类中。然后你用一个扩展了TestBase的类创建你的测试(例如loginTest)。现在你可以多次调用你的方法,每次将它们作为一个单独的测试对待,并根据你的需要将它们与依赖关联起来(也就是说,我根据先前的方法将它们中的每一个连接起来;但是你可以重新排列它们并将它们全部放到取决于一个,还是没有人)。

因为您的测试类从TestBase继承,您甚至不需要创建一个对象来访问内部方法;你可以直接打电话给他们。

希望这可以为你解决,如果你需要更多的信息,请不要犹豫,写评论。

+0

不幸的是,这不是我想要实现的。我提到的这些测试已经构建为@Test方法。我希望从其他测试和其他类中多次调用这些方法。现在,当一些测试依赖于clearCacheTest时,它会被调用一次,如果另一个测试也依赖于clearCacheTest,它将不会再被调用,因为它已经通过了...但我不仅希望它通过,而且实际上做了在这两个测试之前清除缓存两次。 –

+0

好的乔恩得到你,将更新我的答案,以反映你的更新。我仍然认为它是可以实现的,但:) :) –

+1

几乎在那里;)我已经试过这种方法在一开始,它甚至工作,但很快我意识到,它给了我虚假的测试报告。你看,dbReset这种方式没有被定义为一个测试,所以当我运行我的测试编号1即loginFeatureTest:(openURLTest-> dbResetTest-> clearCacheTest-> loginTest)和dbReset失败,出于某种原因,我会得到报告,就好像整个loginFeatureTest失败,我希望看到它实际上是dbResetTest错误。也许唯一的选择是从loginFeatureTest中调用dbReset并用消息声明它的结果? –