前面將基礎打好了,接下來就是具體的使用了,業務層主要是頁面中的各種業務操作,如登錄,修改用戶信息等,我們把這些操作都封裝在業務類中,如登錄操作,我們把它封裝成一個類,登錄的大致流程爲打開登錄頁,輸入用戶名密碼,點擊登錄按鈕,這樣一個完整的登錄業務就算完成了。
那爲什麼不直接寫在測試類中呢,這樣是爲了將業務操作與測試用例分離,因爲多個用例可能是對應一個業務操作的,這樣,我業務代碼是不用動的,只需要修改用例就好了,這樣也是爲了代碼的可讀性,重用性和易維護性。
如下,進入正題:
先看代碼分層:
1.業務層:登錄類Login:
package com.etyero.action;
import org.openqa.selenium.WebDriver;
import com.etyero.object.BasePage;
public class Login {
private WebDriver driver;
private BasePage loginPage;
public Login(WebDriver driver) {
this.driver = driver;
}
// 登錄操作
public void login(String username, String pwd) throws Exception {
loginPage = new BasePage(driver, "loginPage");//這裏的pageName要對應page.xml文件中的page標籤值
loginPage.sendKey("登錄輸入賬號框", username);//登錄輸入賬號框對應的是page.xml中設置的元素名稱
loginPage.sendKey("登錄輸入密碼框", pwd);
loginPage.click("登錄");
}
}
2.用例層,也是實際的測試腳本,調用業務層中的各項業務操作並斷言結果是否符合預期.
登錄測試類:LoginTest
package com.etyero.testcase;
import org.openqa.selenium.WebDriver;
import org.testng.Assert;
import org.testng.annotations.AfterClass;
import org.testng.annotations.AfterTest;
import org.testng.annotations.BeforeClass;
import org.testng.annotations.BeforeMethod;
import org.testng.annotations.DataProvider;
import org.testng.annotations.Listeners;
import org.testng.annotations.Parameters;
import org.testng.annotations.Test;
import com.etyero.action.Login;
import com.etyero.object.BasePage;
import com.etyero.utils.BrowserUtil;
import com.etyero.utils.TestNGListener;
@Listeners({TestNGListener.class})
public class LoginTest {
private WebDriver driver;
private Login login;
@DataProvider(name = "loginParams")
public Object[][] loginParams(){
return new Object[][]{{"li","1111","用戶名或密碼錯誤"},{"li","","請輸入登錄密碼!"},{"","123456","請輸入登錄賬戶!"}};
}
@BeforeClass
@Parameters({"browserDriverUrl","url"})
public void beforeClass(String browserDriverUrl,String url) {
driver = BrowserUtil.chrome(browserDriverUrl,30);
//在內存中運行,不用啓用瀏覽器,使用該方法無法使用截圖功能
//driver = new HtmlUnitDriver();
driver.get(url);
}
@BeforeMethod
public void BeforeMethod(){
login = new Login(driver);
TestNGListener.setDriver(driver);
}
@Test(dataProvider = "loginParams",description = "異常用戶信息登錄")
public void login02(String username,String pwd,String expectedTip) throws Exception{
login.login(username, pwd);
String tip = new BasePage(driver, "loginPage").getText("錯誤提示");
Assert.assertEquals(tip, expectedTip);
}
@Test(dependsOnMethods = "login02",description = "正常用戶登錄")
@Parameters({ "username", "pwd" })
public void login(String username,String pwd) throws Exception {
login.login(username, pwd);
String tip = new BasePage(driver, "mainPage").getText("客服熱線");
Assert.assertEquals(tip, "客服熱線:0755-2309674");
}
@AfterClass
public void afterClass() {
}
@AfterTest
public void afterTest(){
driver.quit();
}
}
testNG配置文件:.xml。這裏我用到了testNG的兩種參數化方式,1.在測試類中通過註解@DataProvider定義測試參數;2.通過xml文件parameter標籤定義測試參數,關於testNG教程,有興趣的童鞋可以看筆者的另一篇博客:http://blog.csdn.net/u010798968/article/details/73549612
<?xml version="1.0" encoding="UTF-8"?>
<suite name="Suite2">
<parameter name="username" value="li" />
<parameter name="pwd" value="123456" />
<parameter name="browserDriverUrl" value="D:\work\workplace\webUITest\browserDriver\chromedriver.exe"/>
<parameter name="url" value="http://XXXXX/login.html"/>
<test name="test">
<classes>
<class name="com.etyero.testcase.LoginTest"/>
</classes>
</test>
</suite>
以上,從第二章到此章,代碼方面的內容基本講完了,當然筆者這樣寫也許不是最好的,有啥想法和建議歡迎討論交流,共同進步,我的資料中有我的各種聯繫方式,歡迎騷擾。下一章,持續集成和測試報告輸出,敬請期待。