TestNG为什么会跳过测试?

11
我正在使用testng和selenium测试一个Web应用程序。测试主要包括打开应用程序的几个页面,并针对每个页面执行一些特定的活动。因此,我有一个抽象基类,它执行“打开页面”测试,并定义了一个抽象方法,该方法用作该测试的数据提供程序。然后有几个扩展类提供数据提供程序的实现,并且除了基类的测试之外,还有几个不同的测试。我有一个testsuite.xml文件,其中包含所有类,这是我从我的eclipse运行的。
问题在于,当我启动测试执行时,testng会为所有对象运行基类中的测试,但系统地跳过扩展类中的其他测试。有人知道原因吗?任何信息都将非常感激...
为了补充信息,这里是我使用的一些类和xml:
基类:
public abstract class BaseWebAppPageTest {

    @Test(dataProvider="getMenuLink")
    public void testOpen(String menulink){
        GenericPageActions.openPage(TestingContext.getSelenium(), menulink);
    }

    protected abstract String[][] getMenuLink();

}

一些扩展类:
TestLanguages:
public class TestLanguages extends BaseWebAppPageTest{

    @Test(dependsOnMethods={"testOpen"}, dataProvider="getCreateData")
    public void testCreateCorrect(String code, String description, String textDirection, String flag){
        Selenium selenium = TestingContext.getSelenium();
        LanguagesManagementActions.create(selenium, code, description, textDirection, flag);
    Assert.assertTrue(selenium.isTextPresent("Successfully created language"));
    }

    @Test(dependsOnMethods={"testCreateCorrect"}, dataProvider="getCreateData")
    public void testFilter(String code, String description, String textDirection, String flag){
        Selenium selenium = TestingContext.getSelenium();
        LanguagesManagementActions.filterTable(selenium, 2, code, 30000);
    Assert.assertTrue(selenium.getXpathCount("xpath=//span[.='"+code+"']").intValue() == 1);
    }

    @Test(dependsOnMethods={"testCreateCorrect"}, dataProvider="getCreateData")
    public void testModify(String code, String description, String textDirection, String flag){
        Selenium selenium = TestingContext.getSelenium();
        LanguagesManagementActions.modify(TestingContext.getSelenium(), code, description, textDirection, flag);
        Assert.assertTrue(selenium.isTextPresent("Successfully updated language"));
    }

    @Override
    @DataProvider
    protected String[][] getMenuLink() {
        return(TestingContext.getDataReader().getTableArray("openviewpage", "MULTILINGUAL_LANGUAGES"));
    }

    @DataProvider
    protected String[][] getCreateData() {
        return(TestingContext.getDataReader().getTableArray("multilingualcreate", "LANGUAGES"));
    }

}

测试翻译:

public class TestTranslations extends BaseWebAppPageTest{

@Test(dependsOnMethods={"testOpen"}, dataProvider="getCreateData")
public void createCorrect(String code, String targetLanguage, String translation){
    Selenium selenium = TestingContext.getSelenium();
    TranslationsManagementActions.create(selenium, code, targetLanguage, translation);
    Assert.assertTrue(selenium.isTextPresent("Successfully created translation"));
}

@Test(dependsOnMethods={"createCorrect"}, dataProvider="getCreateData")
public void update(String code, String targetLanguage, String translation){
    Selenium selenium = TestingContext.getSelenium();
    TranslationsManagementActions.update(selenium, code, targetLanguage, translation);
    Assert.assertTrue(selenium.isTextPresent("Successfully updated translation"));
}

@Test(dependsOnMethods={"createCorrect"}, dataProvider="getCreateData")
public void filter(String code, String targetLanguage, String translation){
    Selenium selenium = TestingContext.getSelenium();
    TranslationsManagementActions.filterTable(selenium, 2, code, 30000);
    Assert.assertTrue(selenium.isElementPresent("xpath=//span[.='"+translation+"']"));
}

@Override
@DataProvider
protected String[][] getMenuLink() {
    return(TestingContext.getDataReader().getTableArray("openviewpage", "MULTILINGUAL_TRANSLATIONS"));
}

@DataProvider
protected String[][] getCreateData() {
    return(TestingContext.getDataReader().getTableArray("multilingualcreate", "TRANSLATIONS"));
}

}

最后,TestSuite.xml 文件:
    <?xml version="1.0" encoding="UTF-8"?>
    <!DOCTYPE suite SYSTEM "http://beust.com/testng/testng-1.0.dtd" >
    <suite name="WebAppSuiteTest" parallel="none">
      <parameter name="selenium.host" value="localhost" />
      <parameter name="selenium.port" value="5555" />
      <parameter name="selenium.browser" value="*firefox3 C:\\Documents and Settings\\dgarcia\\Local Settings\\Application Data\\Mozilla Firefox\\firefox.exe" />
      <parameter name="selenium.url" value="http://localhost:8080/standard-webapp-war/home.seam" />
      <parameter name="selenium.timeout" value="1000000" />
      <parameter name="test.data.filepath" value="src\\test\\resources\\datatest_.xls" />

  <test name="standard" preserve-order="true" >
    <classes>
        <class name="com.standard.webapp.common.TestingContext" />      
        <class name="com.standard.webapp.login.TestLogin"/>
        <class name="com.standard.webapp.TestLanguages"/>
        <class name="com.standard.webapp.TestTranslations"/>
        </class>
    </classes>
  </test>
</suite>

在输出中没有任何异常或原因可以跳过这些测试。我不太确定您提到的输出,因此我将在此处粘贴生成的“myWebAppTest.xml”的内容,其中包含测试结果:

<testsuite hostname="SP2L0044" name="com.sicpa.standard.dms.webapp.selenium.common.BaseWebAppPageTest" tests="14" failures="0" timestamp="4 Mar 2011 08:45:57 GMT" time="27.141" errors="0">
  <testcase name="testLoginLoadHome" time="2.188" classname="com.sicpa.standard.dms.webapp.selenium.login.TestLogin"/>
  <testcase name="testCreateCorrect" time="0.0" classname="com.sicpa.standard.dms.webapp.selenium.multilingual.TestCodes">
    <skipped/>
  </testcase>
  <testcase name="testFilter" time="0.0" classname="com.sicpa.standard.dms.webapp.selenium.multilingual.TestCodes">
    <skipped/>
  </testcase>
  <testcase name="testUpdate" time="0.0" classname="com.sicpa.standard.dms.webapp.selenium.multilingual.TestCodes">
    <skipped/>
  </testcase>
  <testcase name="testView" time="0.0" classname="com.sicpa.standard.dms.webapp.selenium.multilingual.TestCodes">
    <skipped/>
  </testcase>
  <testcase name="testCreateCorrect" time="0.0" classname="com.sicpa.standard.dms.webapp.selenium.multilingual.TestLanguages">
    <skipped/>
  </testcase>
  <testcase name="testFilter" time="0.0" classname="com.sicpa.standard.dms.webapp.selenium.multilingual.TestLanguages">
    <skipped/>
  </testcase>
  <testcase name="testModify" time="0.0" classname="com.sicpa.standard.dms.webapp.selenium.multilingual.TestLanguages">
    <skipped/>
  </testcase>
  <testcase name="createCorrect" time="0.0" classname="com.sicpa.standard.dms.webapp.selenium.multilingual.TestTranslations">
    <skipped/>
  </testcase>
  <testcase name="filter" time="0.0" classname="com.sicpa.standard.dms.webapp.selenium.multilingual.TestTranslations">
    <skipped/>
  </testcase>
  <testcase name="update" time="0.0" classname="com.sicpa.standard.dms.webapp.selenium.multilingual.TestTranslations">
    <skipped/>
  </testcase>
  <testcase name="testOpen" time="2.297" classname="com.sicpa.standard.dms.webapp.selenium.multilingual.TestLanguages"/>
  <testcase name="testOpen" time="12.61" classname="com.sicpa.standard.dms.webapp.selenium.multilingual.TestCodes"/>
  <testcase name="testOpen" time="9.469" classname="com.sicpa.standard.dms.webapp.selenium.multilingual.TestTranslations"/>
</testsuite>
10个回答

13

TestNG跳过测试的原因有很多,最常见的原因是你依赖的某个方法(例如testOpen或createCorrect)以某种方式失败了。

我建议将详细级别设置为10,并将输出粘贴到此处或testng-users邮件列表中。

如果您正在使用XML定义,请像这样设置详细级别:<suite name="sweet_suite" verbose="10">。也可以通过代码配置来设置详细程度。

TestNG tng = new TestNG();
XmlSuite suite = new XmlSuite();

suite.setVerbose(10);

// other configuration, add tests to run

List<XmlSuite> suites = new ArrayList<XmlSuite>();
suites.add( suite );
tng.setXmlSuites(suites);
tng.run();

这实际上有助于找到dataSource抛出的错误。 - Johnny_D
我忘记在我的测试中添加 @dataProviderClass。通过查看详细日志,我该如何找出这个问题? - MasterJoe

9

可能是在DataProvider方法中抛出的错误。


这就是我的案例的原因,浪费了我们数小时的时间来进行故障排除。TestNg DataProvider设计过于脆弱,会在不给出任何提示的情况下默默地跳过测试。 - Jianwu Chen

5

如果您想运行扩展类中的测试而不考虑依赖方法的通过/失败,您可以始终为扩展类中的测试添加 'alwaysRun = true',如下所示:

@Test(dependsOnMethods={"testOpen"}, dataProvider="getCreateData", alwaysRun = true)

2

我曾经遇到过这个问题,后来发现当我在测试类和基础测试类中都有两个@BeforeMethod的注释时,会发生冲突,尽管它们分别执行了不同的操作。最终导致测试无法执行并被跳过。

总之,确保你没有多个任何类型的@Before、@After注释。


2

虽然看起来很傻,但我忘记在我的测试中添加 @dataProviderClass,这就是为什么我的测试被跳过的原因。但 TestNG 没有明确告诉我问题出在哪里。在尝试其他答案之前,始终首先检查这些基础知识。

原始回答: Original Answer


1
一种原因是套件内部的优先级,使用testng的并行概念和线程计数将解决您的问题。
使用方式如下: <suite name="TestSuite" verbose="1" parallel="tests" thread-count="10"

1
如果在执行测试时,您正在使用TestNG方法传入参数但这些参数未被传递,则测试也将被跳过。我最近遇到了这个问题,所以请务必仔细检查。

0

这可能有多种原因,但在查看您的代码后,我注意到一件事情,只需确保您已正确设置浏览器exe,例如要在Chrome上执行测试,您需要在路径中拥有chromedriver.exe。

 System.setProperty("webdriver.chrome.driver", System.getProperty("user.dir")+
                "\\src\\main\\resources\\chromedriver.exe");

0

我遇到了同样的问题,测试被忽略了。在降级到稳定版本的TestNG后,测试开始运行。


-1

大多数情况下,它会跳过那些依赖于其他测试结果或具有某些超时设置或由于配置而被跳过的测试。

如果您已经设置了@afterMethods@afterClass,则值得将其注释掉并重新运行脚本。

您可以为所有测试设置优先级,如果所有测试都依赖于某个特定测试,则将其保留在@beforeMethod@beforeClass中,以适合您的需要。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接