首页 > 代码库 > WebDriver + TestNG 应用【转】

WebDriver + TestNG 应用【转】

出自:http://magustest.com/blog/automationtesting/webdriver-testng/

 

Selenium 2 已经发布了一个多月,官方版本已经到了Selenium 2.3,并且在Google code里面可以找到2.4的下载。Selenium 2 最大的更新就是集成了WebDriver。这两者是什么关系呢?如果你搜索WebDriver,第一条结果是Selenium。其实WebDriver和Selenium可以说是在实现UI Automation的竞争对手。Selenium是运行在JavaScript的sandbox里面,所以很容易就支持不同的浏览器;而WebDriver则是直接操作浏览器本身,更接近用户的真实操作,但正因为如此,所以WebDriver在多浏览器/操作系统的支持上就要落后于Selenium。不过从Selenium 2开始,这两个项目合并了,可以继续用原来的Selenium,也可以考虑迁移到WebDriver。我个人认为WebDriver应该是以后的大趋势,还是值得迁移的。至于你信不信,我反正是信了。

作为一个轻量级的UI Automation框架,需要写一些驱动它的代码,大部分人会选择JUnit,因为JUnit是单元测试的事实标准;但是我会用TestNG。这些UI Automation的东西,它们本身不是单元测试,而且也没有太多单元测试的风格。

从一段简单的测试开始

123456789101112131415
public class GoogleTest  {    @Test    public void search(ITestContext context) {        WebDriver driver = new FirefoxDriver();         driver.get("http://www.google.com");         WebElement element = driver.findElement(By.name("q"));         element.sendKeys("magus");        element.submit();         Assert.assertTrue(driver.getTitle().contains("magus"), "Something wrong with title");                               }}

TestNG应用了Java的Annotations,只需要在测试方法上面打上@Test就可以标示出search是一个测试方法。用TestNG运行测试还需要一个testng.xml的文件,文件名其实可以随便起,没有关系的。

1234567891011
<suite name="Magus demo" verbose="2">    <test name="Search function">        <classes>            <class name="test.GoogleTest">                <methods>                    <include name="search" />                </methods>            </class>        </classes>    </test></suite>

我想让测试更加灵活,1. 可以配置使用任意支持的浏览器进行测试;2. 配置所有Google的URL;3. 配置搜索的关键字。修改后的代码:

123456789101112131415161718192021
public class GoogleTest  {    WebDriver driver;     @Parameters({"browser"})    @BeforeTest    public void setupBrowser(String browser){        if (browser.equals("firefox")){            driver = new FirefoxDriver();        } else {            driver = new ChromeDriver();        }       }        @Parameters({ "url", "keyword" })    @Test    public void search(String url, String keyword, ITestContext context) {        driver.get(url);        WebElement element = driver.findElement(By.name("q"));        element.sendKeys(keyword);        element.submit();        Assert.assertTrue(driver.getTitle().contains(keyword), "Something wrong with title");        }   }

testng.xml

123456789101112131415
<suite name="Magus demo" verbose="2">    <parameter name="browser" value="http://www.mamicode.com/firefox" />    <parameter name="url" value="http://www.google.com" />    <parameter name="keyword" value="http://www.mamicode.com/magus" />    <test name="Search function" preserve-order="true">        <classes>            <class name="test.GoogleTest">                <methods>                    <include name="setupBrowser" />                    <include name="search" />                </methods>            </class>        </classes>    </test></suite>

利用TestNG的@Parameters标签,让测试方法从testng.xml里面读取参数,实现参数化。在testng.xml的配置中,test节点需要增加一个属性的配置: preserve-order=”true”。这个preserve-order默认是false,在节点下面的所有方法的执行顺序是无序的。把它设为true以后就能保证在节点下的方法是按照顺序执行的。TestNG的这个功能可以方便我们在testng.xml里面拼装测试。假设我们有很多独立的测试方法,例如

  • navigateCategory
  • addComment
  • addFriend
  • login
  • logout

就可以在testng.xml里面拼出不同的测试,例如

12345678910111213141516171819202122
<test name="Add friend" preserve-order="true">    <classes>        <class name="test.GoogleTest">            <methods>                <include name="login" />                <include name="addFriend" />                <include name="logout" />            </methods>        </class>    </classes></test><test name="Add comment to category" preserve-order="true">    <classes>        <class name="test.GoogleTest">            <methods>                <include name="login" />                <include name="navigateCategory" />                <include name="addComment" />                <include name="logout" />            </methods>        </class>    </classes></test>

TestNG比JUnit更加适合做一些非单元测试的事情,不是说JUnit不好,而是不能把JUnit当成万能的锤子,到处钉钉子。WebDriver的API比Selenium的更加简洁,会是以后的大趋势。

 

WebDriver + TestNG 应用【转】