某些测试TestNG中未报告 [英] Certain tests not reporting in TestNG
问题描述
我使用TestNG和硒在Eclipse,Java中。我有测试
的方法调用其他方法为它需要执行的操作的支持。我把它们作为测试的一部分,使用标记 @Test
。
@BeforeTest
公共无效beforeTest(){
。driver.manage()窗口()最大()。
}@测试
公共静态无效checkValidity(String []数组,司机的webdriver){
串partialURL =;
INT brokenLinks = 0;
为(中间体X = 1; X&下; array.length; X + = 2){
partialURL = anonUserSitemapExperience.getPartialURL(驱动程序,数组[X]);
如果(partialURL.isEmpty()){
通信System.err.println(链接\\+阵列[X] +\\意为+阵列[X-1] +页或者是损坏或外部网站。);
brokenLinks ++;
brokenLinksTot ++;
}
其他{
INT发现= anonUserSitemapExperience.findMatch(数组,array.length,partialURL);
如果(发现< 1){
通信System.err.println(一场比赛未找到+阵列[X-1] + +阵列[X] +\\ n+ partialURL\\ n);
brokenLinks ++;
brokenLinksTot ++;
}
}
}
通信System.err.println(\\ n+ brokenLinks +断开链接(S)的/发现\\ n);
}@测试
公共静态无效openDropDowns(webdriver的驱动程序){
清单< WebElement> dropdownArrows = driver.findElements(By.className(dropdownToggler));
迭代器< WebElement> ITR = dropdownArrows.iterator();
而(itr.hasNext()){
尝试{
。itr.next()点击();
}
赶上(ElementNotVisibleException E){
}
}
}@测试
公共静态的String [] createArray(列表< WebElement>名单){
的String [] = linkArray新的String [则为list.size()* 2];
INT计数器= 0;
为(中间体X = 1; X&下; linkArray.length; X + = 2){
linkArray [X] = list.get(计数器).getAttribute(的href);
尝试{
linkArray [X] = linkArray [X] .replaceAll(%C2%AE,®);
linkArray [X] = linkArray [X] .replaceAll(%20,);
linkArray [X] = linkArray [X] .replaceAll(%27,');
linkArray [X] = linkArray [X] .replaceAll(%C 3%的A4,A);
linkArray [X] = linkArray [X] .replaceAll(%C3%B6,O);
linkArray [X] = linkArray [X] .replaceAll(%C3%BC,U);
linkArray [X] = linkArray [X] .replaceAll(%C3%84,A);
linkArray [X] = linkArray [X] .replaceAll(%C3%96,O);
linkArray [X] = linkArray [X] .replaceAll(%C3%9C,U);
linkArray [X] = linkArray [X] .replaceAll(%E2%80%93, - );
linkArray [X] = linkArray [X] .replaceAll(%E2%84%A2,™);
linkArray [X] = linkArray [X] .replaceAll(%25,%);
反++;
}
赶上(例外五){
}
}
INT计数器2 = 0;
为(中间体X = 0; X&下; linkArray.length; X + = 2){
linkArray [X] = list.get(C2的).getText();
计数器2 ++;
}
返回linkArray;
}@测试
公共无效测试(){
driver.get(siteUS);
清单< WebElement> topNavLinks = driver.findElement(By.className(topNavigationMenu))findElements(By.className(menuLink))。
INT numLinks = topNavLinks.size();
的String [] = topNavTitlesAndLinks新的String [numLinks * 2];
topNavTitlesAndLinks = createArray(topNavLinks);
的System.out.println(补缺标题和链接数组。);
为(中间体X = 1; X&下; topNavTitlesAndLinks.length; X + = 2){
driver.get(topNavTitlesAndLinks [X]);
openDropDowns(驾驶员);
尝试{
清单< WebElement>菜单= driver.findElement(By.className(asideNavigationMenu))findElements(By.className(itemLink))。
的String [] = menuArray新的String [menu.size()* 2];
menuArray = createArray(菜单);
checkValidity(menuArray,驱动程序);
}
赶上(例外五){
如果(topNavTitlesAndLinks [X-1]。载(牙髓)){
WebElement元= driver.findElement(By.linkText(根管治疗));
操作动作=新的动作(驱动器);
action.moveToElement(元素).perform();
WebElement子元素= driver.findElement(By.partialLinkText(访问));
action.moveToElement(子元素);
action.click();
action.perform();
openDropDowns(驾驶员);
清单< WebElement>菜单= driver.findElement(By.className(asideNavigationMenu))findElements(By.className(itemLink))。
的String [] = menuArray新的String [menu.size()* 2];
menuArray = createArray(菜单);
checkValidity(menuArray,驱动程序);
}
}
}
}@AfterTest
公共无效afterTest(){
driver.close();
driver.quit(); (发现\\ n总计损坏的链接:+ brokenLinksTot)通信System.err.println; 长的时间2 = System.currentTimeMillis的();
双时间min =((双)(时间2-时间1)/ 60000);
INT timeMinTrunc =(int)的时间min;
双timeSec =(时间min%1)* 60; 的System.out.println(\\ n \\ n所有测试完成了+ timeMinTrunc +分+ timeSec +秒);
}
问题是,当我运行它,我没有得到传球后由测试
调用的方法失败。我的输出如下:
失败:测试
SKIPPED:checkValidity
SKIPPED:openDropDowns
块引用>那么,怎样才能让我所有的调用的方法报告呢?
解决方案
- 非void的方法是通过TestNG的忽略
- 您不应调用的测试方法自己 - 这是TestNG的
工作- 重写你的测试类,这样的方法
@Test
注释反映您的方案,并按照一排。那么你可以使用任何你想要的helper方法。例如
@BeforeClass
前公共无效(){
//等等等等precondition放在这里
}@Test(优先级= 0)
公共无效的start(){
//暴躁测试0到这里
}@Test(dependsOnMethods =开始)
公共无效的next(){
SYSOUT(DoSomething的());
}公共字符串DoSomething的(){
返回辅助方法,我在一些测试方法称之为;
}UPD
如果您想要调用400次:
@dataProvider(NAME =400_links)
公共静态的String [] [] getLinks(){
//找到自己的方式在这里创建链接
返回新的String [] [] {{HTTP://富},{HTTP://栏},{HTTP:// XYZ}};
}@Test(的dataProvider =400_links)
公共无效checkAllLinks(字符串连接){
checkValidityOrWhatever(链接);
}公共无效checkValidityOrWhatever(字符串连接){
//等等等等HTTP FTW
}这将启动400次,如果你在
提供400链接getLinks()
每一次迭代将被TestNG的报告。失败的迭代不会从发射阻止其他调用。I'm using TestNG and Selenium in Eclipse, in Java. I have a method
test
that calls the other methods as support for the actions it needs to perform. I have them marked as part of the test using@Test
.@BeforeTest public void beforeTest() { driver.manage().window().maximize(); } @Test public static void checkValidity(String[] array, WebDriver driver){ String partialURL = ""; int brokenLinks = 0; for (int x=1; x<array.length; x+=2){ partialURL = anonUserSitemapExperience.getPartialURL(driver, array[x]); if (partialURL.isEmpty()){ System.err.println("The link \""+array[x]+"\" intended for the "+array[x-1]+" page is either broken or an external site."); brokenLinks++; brokenLinksTot++; } else{ int found = anonUserSitemapExperience.findMatch(array, array.length, partialURL); if (found<1){ System.err.println("A match was not found for "+array[x-1]+".\n"+array[x]+"\n"+partialURL); brokenLinks++; brokenLinksTot++; } } } System.err.println("\n"+brokenLinks+" broken link(s) was/were found.\n"); } @Test public static void openDropDowns(WebDriver driver){ List<WebElement> dropdownArrows = driver.findElements(By.className("dropdownToggler")); Iterator<WebElement> itr = dropdownArrows.iterator(); while(itr.hasNext()){ try{ itr.next().click(); } catch(ElementNotVisibleException e){ } } } @Test public static String[] createArray(List<WebElement> list){ String[] linkArray = new String[list.size()*2]; int counter = 0; for (int x=1; x<linkArray.length; x+=2){ linkArray[x] = list.get(counter).getAttribute("href"); try{ linkArray[x] = linkArray[x].replaceAll("%C2%AE", "®"); linkArray[x] = linkArray[x].replaceAll("%20", " "); linkArray[x] = linkArray[x].replaceAll("%27", "'"); linkArray[x] = linkArray[x].replaceAll("%C3%A4", "ä"); linkArray[x] = linkArray[x].replaceAll("%C3%B6", "ö"); linkArray[x] = linkArray[x].replaceAll("%C3%BC", "ü"); linkArray[x] = linkArray[x].replaceAll("%C3%84", "Ä"); linkArray[x] = linkArray[x].replaceAll("%C3%96", "Ö"); linkArray[x] = linkArray[x].replaceAll("%C3%9C", "Ü"); linkArray[x] = linkArray[x].replaceAll("%E2%80%93", "–"); linkArray[x] = linkArray[x].replaceAll("%E2%84%A2", "™"); linkArray[x] = linkArray[x].replaceAll("%25", "%"); counter++; } catch(Exception e){ } } int counter2 = 0; for (int x=0; x<linkArray.length; x+=2){ linkArray[x] = list.get(counter2).getText(); counter2++; } return linkArray; } @Test public void test() { driver.get(siteUS); List<WebElement> topNavLinks = driver.findElement(By.className("topNavigationMenu")).findElements(By.className("menuLink")); int numLinks = topNavLinks.size(); String[] topNavTitlesAndLinks = new String[numLinks*2]; topNavTitlesAndLinks = createArray(topNavLinks); System.out.println("Filled titles and links array."); for (int x=1; x<topNavTitlesAndLinks.length; x+=2){ driver.get(topNavTitlesAndLinks[x]); openDropDowns(driver); try{ List<WebElement> menu = driver.findElement(By.className("asideNavigationMenu")).findElements(By.className("itemLink")); String[] menuArray = new String[menu.size()*2]; menuArray = createArray(menu); checkValidity(menuArray, driver); } catch (Exception e){ if (topNavTitlesAndLinks[x-1].contains("Endodontics")){ WebElement element = driver.findElement(By.linkText("Endodontics")); Actions action = new Actions(driver); action.moveToElement(element).perform(); WebElement subElement = driver.findElement(By.partialLinkText("Access")); action.moveToElement(subElement); action.click(); action.perform(); openDropDowns(driver); List<WebElement> menu = driver.findElement(By.className("asideNavigationMenu")).findElements(By.className("itemLink")); String[] menuArray = new String[menu.size()*2]; menuArray = createArray(menu); checkValidity(menuArray, driver); } } } } @AfterTest public void afterTest() { driver.close(); driver.quit(); System.err.println("\nTotal broken links found: "+brokenLinksTot); long time2 = System.currentTimeMillis(); double timeMin =((double)(time2-time1)/60000); int timeMinTrunc = (int)timeMin; double timeSec = (timeMin%1)*60; System.out.println("\n\nAll tests finished in "+timeMinTrunc+" minutes and "+timeSec+" seconds."); }
Problem is, when I run it, I don't get pass fails from the methods that are called by
test
. My output is as follows:FAILED: test
SKIPPED: checkValidity
SKIPPED: openDropDowns
So how can I make all of the called methods report as well?
解决方案
- Non-void methods are ignored by TestNG
- You should not call test methods yourself - it is a job for TestNG
- Rewrite your test class so that methods annotated with
@Test
reflect your scenario and follow in a row. You can then use any helper methods you want.E.g.
@BeforeClass public void before() { //blah blah precondition goes here } @Test(priority=0) public void start() { // testy test 0 goes here } @Test(dependsOnMethods = "start") public void next() { Sysout(doSomething()); } public String doSomething() { return "Helper method which I call in some test method"; }
UPD
If you want to invoke 400 times:
@DataProvider(name = "400_links") public static String[][] getLinks() { // find your own way to create links here return new String[][] {{"http://foo"}, {"http://bar"}, ... , {"http://xyz"}}; } @Test(dataProvider = "400_links") public void checkAllLinks(String link) { checkValidityOrWhatever(link); } public void checkValidityOrWhatever(String link) { //blah blah http ftw }
It will be launched 400 times, if you have 400 links provided in
getLinks()
Every iteration will be reported by Testng. Failed iterations will not stop other invocations from launch.这篇关于某些测试TestNG中未报告的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!