我是一个实习生自动化测试大公司网站的老实人,老实说,我在我的脑海中。我正在尝试学习所有内容并同时使用它,并且该公司中没有其他人知道如何使用我正在使用的工具,所以我没有很多选择,只要求人们寻求帮助。所以这可能相当明显。无论如何,我在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 loop
(总共超过1300次迭代)。我希望能够将for loop
写入方法中的内容,然后一遍又一遍地调用它,以便我可以从TestNG获得通过/失败。希望这能澄清我的要求。谢谢!
答案 0 :(得分:1)
@ burnst14,这是我所拥有的测试用例的示例,这是一个端到端的场景,它涵盖了顺序执行5个REST API调用。不要担心它到底在做什么,只要知道我正在创建方法,并在多个测试中重用它们。我相信有些人会不同意我在下面做了一些事情的方式,但是知道下面的每个方法都被多次重复使用。实际上,结构几乎是重复的,“RunProvision()”经常被替换。
apply plugin: 'com.android.application'
android {
compileSdkVersion 22
buildToolsVersion "22.0.1"
defaultConfig {
applicationId "com.example.ianz.onionmusic"
minSdkVersion 9
targetSdkVersion 22
versionCode 1
versionName "1.0"
}
buildTypes {
release {
minifyEnabled false
proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro'
}
}
答案 1 :(得分:0)
您正在寻找的是页面对象模型。使用此模型,它可以轻松地维护和重用您的类和方法。
基本概念是为要测试的每个页面创建页面对象。此页面对象封装了页面的所有信息和方法,如果页面发生变化,您只需在此处更新代码。这反过来允许您的TestNG测试仅关注实际测试。有关在线可用的页面对象模型的信息,here是我收藏的一个。