前面将基础打好了,接下来就是具体的使用了,业务层主要是页面中的各种业务操作,如登录,修改用户信息等,我们把这些操作都封装在业务类中,如登录操作,我们把它封装成一个类,登录的大致流程为打开登录页,输入用户名密码,点击登录按钮,这样一个完整的登录业务就算完成了。
那为什么不直接写在测试类中呢,这样是为了将业务操作与测试用例分离,因为多个用例可能是对应一个业务操作的,这样,我业务代码是不用动的,只需要修改用例就好了,这样也是为了代码的可读性,重用性和易维护性。
如下,进入正题:
先看代码分层:
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>
以上,从第二章到此章,代码方面的内容基本讲完了,当然笔者这样写也许不是最好的,有啥想法和建议欢迎讨论交流,共同进步,我的资料中有我的各种联系方式,欢迎骚扰。下一章,持续集成和测试报告输出,敬请期待。