某些测试未在 TestNG 中报告

Certain tests not reporting in TestNG

我在 Java 中使用 Eclipse 中的 TestNG 和 Selenium。我有一个方法 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.");
}

问题是,当我 运行 它时,我没有从 test 调用的方法中得到传递失败。我的输出如下:

FAILED: test

SKIPPED: checkValidity

SKIPPED: openDropDowns

那么我怎样才能让所有被调用的方法也报告呢?

只有顶级 @Test 会报告结果。 checkValidity,IMO,不会是测试用例,它更像是一种验证,会导致测试通过或失败。请记住,@Test 应该表示一个测试用例,一个场景,从头到尾。我应该能够查看 @Test 并确切地知道您要完成什么。在您的示例中,您似乎正在尝试验证列表框中的条目。您的测试名称应该反映这一点,并且按照它的书写方式,第一次失败命中,测试将失败。如果您需要在失败之前首先验证每个条目,那么您将需要适当地构建您的失败消息,并且在所有 iterations/clicks 完成之前不要抛出异常。

  1. 非 void 方法被 TestNG 忽略
  2. 您不应该自己调用测试方法 - 这是 TestNG 的工作
  3. 重写您的测试 class 以便用 @Test 注释的方法反映您的场景并连续进行。然后您可以使用任何您想要的辅助方法。

例如

@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

如果要调用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
}

它将启动 400 次,如果您在 getLinks() 中提供了 400 个链接,每次迭代都会由 Testng 报告。失败的迭代不会停止启动其他调用。