webUI自動化測試框架(四):代碼分層-操作層及用例層

前面將基礎打好了,接下來就是具體的使用了,業務層主要是頁面中的各種業務操作,如登錄,修改用戶信息等,我們把這些操作都封裝在業務類中,如登錄操作,我們把它封裝成一個類,登錄的大致流程爲打開登錄頁,輸入用戶名密碼,點擊登錄按鈕,這樣一個完整的登錄業務就算完成了。

那爲什麼不直接寫在測試類中呢,這樣是爲了將業務操作與測試用例分離,因爲多個用例可能是對應一個業務操作的,這樣,我業務代碼是不用動的,只需要修改用例就好了,這樣也是爲了代碼的可讀性,重用性和易維護性。

如下,進入正題:

先看代碼分層:


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>


以上,從第二章到此章,代碼方面的內容基本講完了,當然筆者這樣寫也許不是最好的,有啥想法和建議歡迎討論交流,共同進步,我的資料中有我的各種聯繫方式,歡迎騷擾。下一章,持續集成和測試報告輸出,敬請期待。


發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章