Selenium 2 大的更新是集成了WebDriver。這兩者是什么關(guān)系呢?如果你搜索WebDriver,第一條結(jié)果是Selenium。其實(shí)WebDriver和Selenium可以說(shuō)是在實(shí)現(xiàn)UI Automation的競(jìng)爭(zhēng)對(duì)手。Selenium是運(yùn)行在JavaScript的sandbox里面,所以很容易支持不同的瀏覽器;而WebDriver則是直接操作瀏覽器本身,更接近用戶的真實(shí)操作,但正因?yàn)槿绱,所以WebDriver在多瀏覽器/操作系統(tǒng)的支持上要落后于Selenium。不過(guò)從Selenium 2開(kāi)始,這兩個(gè)項(xiàng)目合并了,可以繼續(xù)用原來(lái)的Selenium,也可以考慮遷移到WebDriver。我個(gè)人認(rèn)為WebDriver應(yīng)該是以后的大趨勢(shì),還是值得遷移的。至于你信不信,我反正是信了。
作為一個(gè)輕量級(jí)的UI Automation框架,需要寫(xiě)一些驅(qū)動(dòng)它的代碼,大部分人會(huì)選擇JUnit,因?yàn)镴Unit是單元測(cè)試的事實(shí)標(biāo)準(zhǔn);但是我會(huì)用TestNG。這些UI Automation的東西,它們本身不是單元測(cè)試,而且也沒(méi)有太多單元測(cè)試的風(fēng)格。
從一段簡(jiǎn)單的測(cè)試開(kāi)始
publicclassGoogleTest{@Testpublicvoidsearch(ITestContext context){WebDriver driver=newFirefoxDriver();
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應(yīng)用了Java的Annotations,只需要在測(cè)試方法上面打上@Test可以標(biāo)示出search是一個(gè)測(cè)試方法。用TestNG運(yùn)行測(cè)試還需要一個(gè)testng.xml的文件,文件名其實(shí)可以隨便起,沒(méi)有關(guān)系的。
<suitename="Magus demo"verbose="2"><testname="Search function"><classes><classname="test.GoogleTest"><methods><includename="search"/></methods></class></classes></test></suite>
我想讓測(cè)試更加靈活,1. 可以配置使用任意支持的瀏覽器進(jìn)行測(cè)試;2. 配置所有Google的URL;3. 配置搜索的關(guān)鍵字。修改后的代碼:
publicclassGoogleTest{WebDriver driver;
@Parameters({"browser"})@BeforeTestpublicvoidsetupBrowser(Stringbrowser){if(browser.equals("firefox")){driver=newFirefoxDriver();}else{driver=newChromeDriver();}}
@Parameters({"url","keyword"})@Testpublicvoidsearch(Stringurl,Stringkeyword, 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
<suitename="Magus demo"verbose="2"><parametername="browser"value="firefox"/><parametername="url"
value="http://www.google.com"/><parametername="keyword"value="magus"/><testname="Search function"preserve-order="true"><classes><classname="test.GoogleTest"><methods><includename="setupBrowser"/><includename="search"/>
</methods></class></classes></test></suite>
利用TestNG的@Parameters標(biāo)簽,讓測(cè)試方法從testng.xml里面讀取參數(shù),實(shí)現(xiàn)參數(shù)化。在testng.xml的配置中,test節(jié)點(diǎn)需要增加一個(gè)屬性的配置: preserve-order=”true”。這個(gè)preserve-order默認(rèn)是false,在節(jié)點(diǎn)下面的所有方法的執(zhí)行順序是無(wú)序的。把它設(shè)為true以后能保證在節(jié)點(diǎn)下的方法是按照順序執(zhí)行的。TestNG的這個(gè)功能可以方便我們?cè)趖estng.xml里面拼裝測(cè)試。假設(shè)我們有很多獨(dú)立的測(cè)試方法,例如
navigateCategory
addComment
addFriend
login
logout
可以在testng.xml里面拼出不同的測(cè)試,例如
<testname="Add friend"preserve-order="true"><classes><classname="test.GoogleTest"><methods><includename="login"/><includename="addFriend"/>
<includename="logout"/></methods></class></classes></test><testname="Add comment to category"preserve-order="true"><classes><classname="test.GoogleTest"><methods><includename="login"/><includename="navigateCategory"/>
<includename="addComment"/><includename="logout"/></methods></class></classes></test>
TestNG比JUnit更加適合做一些非單元測(cè)試的事情,不是說(shuō)JUnit不好,而是不能把JUnit當(dāng)成的錘子,到處釘釘子。WebDriver的API比Selenium的更加簡(jiǎn)潔,會(huì)是以后的大趨勢(shì)。
之后打算分享一下如何用ant把自動(dòng)化測(cè)試自動(dòng)化起來(lái)。
http://magustest.com/blog/automationtesting/webdriver-testng/