gpt4 book ai didi

java - 如何重用 TestNG 中的方法?

转载 作者:行者123 更新时间:2023-11-30 08:04:50 26 4
gpt4 key购买 nike

我是一名实习生,负责一家大公司网站的自动化测试,老实说,我有点不知所措。我正在尝试学习所有内容并同时使用它,而这家公司的其他人都不知道如何使用我正在使用的工具,所以就向人们寻求帮助而言,我没有太多选择。所以这可能是相当明显的。无论如何,我在 Eclipse 中使用 TestNG 和 Selenium,使用 Java。在找到 TestNG 之前,我编写了相当多的测试,所以现在我尝试用 TestNG 重写它们,因为它提供了更好的反馈,并且不会因为一个测试而使整个测试失败。问题是,我的测试有很多方法,我重复使用了很多很多次。我的一个测试大约有 140 行代码,如果我用我目前对 TestNG 的了解来编写它,那将是 1000 行代码。所以我的问题是,有没有办法在 TestNG 的整个测试过程中重复调用相同的方法,或者我是否注定要复制和粘贴几个小时?

TL;DR - 如何使用 TestNG 重用代码?您能给我指出一些使用 TestNG 的有效且高效的结构示例吗?

这是我当前的一些没有 TestNG 的代码:

public static void sideBarNavAll(WebDriver driver, String site){
driver.get(site);
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);
}
}
}
}

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");
}

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){
}
}
}

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;
}

}

方法 openDropDowns 被多次调用,并且 checkValidity 方法中有一个巨大的 for 循环(总共超过 1300 次迭代)。我希望能够将 for 循环的作用写入一个方法中,然后一遍又一遍地调用它,以便我可以从 TestNG 获得通过/失败的结果。希望这能澄清我的要求。谢谢!

最佳答案

@burnst14,这是我拥有的测试用例的示例,这是一个端到端场景,它涵盖了顺序执行 5 个 REST API 调用。不用担心它到底在做什么,只需知道我正在创建方法,并在多个测试中重用它们即可。我确信有些人会不同意我在下面完成一些事情的方式,但要知道下面的每个方法都被多次重复使用。事实上,该结构几乎是重复的,“RunProvision()”经常被替换。

@DataProvider(name = "data1")
public Object[][] data1() throws Exception{
Object[][] retObj = Utils.getExcelData(DATAFILE, sheet, "xxx", "yyy");
return retObj;
}


@Test(priority=1, dataProvider="data1", groups={"group1"})
public void TestCase1(Integer id, Map<String,String> hmData, ITestContext ctx) throws Exception {
try {
Utils.logTitle(1);
setAttribute(hmData, ctx);
populateMaps(hmData);
runProvision();
buildSummaryPassed();
} catch (Exception e) {
buildReporterSummary(e.getMessage());
buildSummaryFailed(e.getMessage());
}
}

关于java - 如何重用 TestNG 中的方法?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31271084/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com