如何重用TestNG中的方法?

时间:2015-07-07 14:14:25

标签: java eclipse selenium methods testng

我是一个实习生自动化测试大公司网站的老实人,老实说,我在我的脑海中。我正在尝试学习所有内容并同时使用它,并且该公司中没有其他人知道如何使用我正在使用的工具,所以我没有很多选择,只要求人们寻求帮助。所以这可能相当明显。无论如何,我在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获得通过/失败。希望这能澄清我的要求。谢谢!

2 个答案:

答案 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是我收藏的一个。