我正在使用testng和selenium测试网络应用。测试主要包括打开应用程序的几个页面,并针对每个页面执行一些特定的活动。所以我有一个抽象基类,它执行“开放页面”测试,并定义了一个抽象方法,用作该测试的数据提供者。然后有几个扩展类为数据提供者提供实现,并且除了基类之外还有几个不同的测试。我有一个testsuite.xml,其中包含所有类,这是我从我的日食中运行的。
问题在于,当我启动测试执行时,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"));
}
}
TestTranslations:
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>
答案 0 :(得分:10)
TestNG跳过测试有多种原因,最常见的是你依赖的方法(例如testOpen或createCorrect)以某种方式失败。
我建议将详细级别设置为10并将输出粘贴到此处或testng-users邮件列表中。
答案 1 :(得分:3)
可能是DataProvider方法中抛出的错误。
答案 2 :(得分:2)
如果您希望在扩展类中运行测试而不管依赖方法的通过/失败,您始终可以添加&#39; alwaysRun = true&#39;对于像这样扩展类的测试:
@Test(dependsOnMethods={"testOpen"}, dataProvider="getCreateData", alwaysRun = true)
答案 3 :(得分:2)
我过去遇到过这个问题,我发现当我有2个@BeforeMethod注释时,一个在test.class中,一个在basetest.class中。顺便说一下,两者都做了不同的事情,但仍然发生了碰撞 - 阻止测试被执行并最终跳过。 结论:检查您没有多个@Before,@After任何类型。
答案 4 :(得分:1)
一个原因是套件类内部的优先级,使用线程数测试的并行概念将解决您的问题。
像这样使用:
答案 5 :(得分:0)
如果您在testNG方法中接受参数但是在执行时没有传递参数,也会跳过测试。 我最近遇到了这个问题,所以只需仔细检查。
答案 6 :(得分:0)
这可能有多种原因,但在看到您的代码后我发现了一件事,只需确保您已正确设置浏览器exe,就像在Chrome上执行测试一样,您需要在路径中使用chromedriver.exe
System.setProperty("webdriver.chrome.driver", System.getProperty("user.dir")+
"\\src\\main\\resources\\chromedriver.exe");
答案 7 :(得分:0)
我有同样的问题,测试被忽略。降级为稳定版的TestNG后,它开始运行测试。
答案 8 :(得分:0)
看起来很愚蠢,我忘了在测试中添加@dataProviderClass。这就是为什么我的测试被跳过的原因。但是testng没有明确告诉我问题出在哪里。在尝试其他答案之前,请务必先检查这些基础知识。
答案 9 :(得分:-1)
大多数情况下,它会跳过那些依赖于其他测试结果或者设置超时或配置的测试。
如果您设置了@afterMethods
或@afterClass
,则值得对其进行一次评论并重新运行该脚本。
您可以做的是在所有测试中设置优先级,如果所有测试都依赖于某个测试,那么请将其保留在适合您的@beforeMethod
或@beforeClass
中。