Java 某些测试未在TestNG中报告
我正在用Java在Eclipse中使用TestNG和Selenium。我有一个方法Java 某些测试未在TestNG中报告,java,eclipse,selenium,annotations,testng,Java,Eclipse,Selenium,Annotations,Testng,我正在用Java在Eclipse中使用TestNG和Selenium。我有一个方法test,它调用其他方法来支持它需要执行的操作。我使用@test将它们标记为测试的一部分 @BeforeTest public void beforeTest() { driver.manage().window().maximize(); } @Test public static void checkValidity(String[] array, WebDriver driver){ Str
test
,它调用其他方法来支持它需要执行的操作。我使用@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.");
}
@BeforeTest
测试前公共无效(){
driver.manage().window().maximize();
}
@试验
公共静态无效检查有效性(字符串[]数组,WebDriver驱动程序){
字符串partialURL=“”;
int-brokenLinks=0;
对于(int x=1;x只有顶级的@Test
才会报告结果。在我看来,checkValidity不是一个测试用例,它更多的是一个验证,会导致测试通过或失败。记住,@Test
应该从头到尾都表示一个测试用例,一个场景。我应该能够查看@Test
,并确切地知道什么是测试t您正在尝试完成。在您的示例中,您似乎正在尝试验证列表框中的条目。您的测试名称应该反映这一点,以及它的编写方式,第一次失败命中,测试将失败。如果您需要在失败之前先验证每个条目,那么您需要生成失败消息Approv在所有迭代/单击完成之前,不要抛出异常
TestNG忽略非void方法
您不应该自己调用测试方法——这是TestNG的工作
重写您的测试类,以便用@test
注释的方法反映您的场景,并按顺序进行操作。然后,您可以使用所需的任何帮助器方法
例如
UPD
如果要调用400次:
@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
}
如果在getLinks()中提供了400个链接,它将被启动400次
每一次迭代都将由Testng报告。失败的迭代将不会阻止其他调用的启动。似乎这与Selenium或eclipse无关。将问题缩小一点如何。请看:我在程序中使用Selenium库和命令,所以我认为应该包括它。eclipse是我正在使用的IDE。这不是标记的工作方式吗?如果我做错了,很抱歉。请阅读链接!如果您将问题减少到最简单的复制步骤,您将发现唯一相关的东西将是Java和TestNG。其他一切都只是分散了对实际发生的事情的注意力。如果您知道一个事实,即:或者一些隐藏的Eclipse首选项正在影响此代码的运行方式,那么您知道的比我多,我将非常感谢您提供的信息,因为我正在尝试使此工作正常进行。您是否确实知道,只有TestNG和Java在这里运行才会产生此问题?如果是,您知道如何解决此问题?谢谢!您有任何建议吗如何设置格式以使每个checkValidity方法报告通过或失败?我试图避免整个测试用例失败,但拥有来自每个checkValidity的报告正是我要做的。我正在验证这些条目,正是。我该如何做才能不让测试用例失败,而是让checkValidity的迭代失败?我不知道“我不明白,System.err.println()是否会导致循环退出?如果是这样,请摆脱它,您有其他方法来记录结果,我建议改用apache的记录器。或者只写控制台。然后,检查BrokenLink是否>0,如果是,则测试失败。大多数人使用Assert.fail(),或其他一些断言方法来触发失败。不,它不会导致循环退出。这只是一个写入控制台操作。这不是我想要的功能。我想要checkValidity
多次运行,每次运行,通过或失败,并在TestNG控制台中有反映这一点的输出。这是我无法获得的部分。我sSysout
用于让TestNG调用该方法的命令?不,它不是System.out.print()。那么,如果我不应该调用该方法,我如何让TestNG调用该方法?如果使用@Test
或任何@Before\\\@After
注释对方法进行注释,TestNG将调用该方法本身。如果您自己调用该方法,并且希望它被TestNG注意到,那么您做错了:)好的,那么你能想出什么方法来编写这个测试,使checkValidity
方法在每次迭代时都报告,而不必一次又一次地复制和粘贴方法吗?我有400多个该方法的迭代要进行,并且希望每次都有一个报告。
@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
}