【实战练习】用户端App自动化测试实战
【实战练习】用户端 App 自动化测试实战
实战需求
实现思路
编写 App 自动化测试脚本
- 梳理涉及到的相关页面,并在方法的返回值中明确页面的跳转关系。
# page的目录结构
page
├── BasePage
└── WeworkApp
# 具体的业务 page 类
├── AddMemberPage
├── ContactPage
├── EditMemberPage
├── MainPage
├── ManualAddMemberPage
├── PersonalConfigInfoPage
├── PersonalInfoPage
├── SearchMemberPage
- Python 部分演示代码
class ContactPage(BasePage):
def goto_search_member_page(self):
return SearchMemberPage(self.driver)
def goto_add_member_page(self):
return AddMemberPage(self.driver)
def goto_personal_info_page(self, name):
return PersonalInfoPage(self.driver)
- Java 部分演示代码
// 部分演示代码
public class ContactPage extends WeworkApp {
public ContactPage(AndroidDriver driver) {
super(driver);
}
@Step("跳转查找成员页面")
public SearchMemberPage gotoSearchMemberPage() {
return new SearchMemberPage(driver);
}
@Step("跳转添加成员页面")
public AddMemberPage gotoAddMemberPage() {
return new AddMemberPage(driver);
}
@Step("跳转个人信息页面")
public PersonalInfoPage gotoPersonalInfoPage(String name){
return new PersonalInfoPage(driver);
}
}
- 编写测试用例,体现出来测试步骤,实现设置为空。
// 伪代码演示
searchRes = mainPage
.gotoContactPage()
.gotoPersonalInfoPage("张三10")
.gotoPersonalConfigInfoPage()
.gotoEditMemberPage()
.deleteMember()
.gotoSearchMemberPage()
.searchMemberFail("张三10");
assert "没有找到相关结果" == searchRes
-
编写统一的前置后置动作。
-
Python 版本
# 部分代码
# 初始化 App页面
class TestContact:
def setup_class(self):
self.main_page = MainPage()
# 退出driver与应用
def teardown_class(self):
self.main_page.quit()
# 回到首页
def teardown(self):
self.main_page.goto_main()
- Java 版本
// 部分代码
//初始化 App页面
@BeforeAll
public static void setUpClass() {
mainPage = new MainPage();
}
// 退出driver与应用
@AfterAll
public static void tearDownClass(){
mainPage.quit();
}
// 回到首页
@AfterEach
public void tearDown() {
mainPage.gotoMain();
}
- 实现每个页面需要实现的操作与步骤。
- 优化测试框架,封装重复动作,目的是为了让测试框架更好用。
比如可以在做find()
操作的时候封装一个灵活的截图方法,让调用者可以灵活选择是否要在查找该元素的时候进行截图:
- Python 版本
# 部分代码
class BasePage:
def find(self, by, value):
"""
单个元素查找
:param by:
:param value:
:return:
"""
step_text = f"使用 {by} 的定位方式进行 {value} 的定位操作"
logger.info(step_text)
with allure.step(step_text):
self.screenshot()
self.save_page_source()
return self.driver.find_element(by, value)
- Java 版本
public WebElement find(By by, boolean flag){
WebElement element = driver.findElement(by);
if(flag){
try {
logger.info("被截图的元素为:{}", by);
ElementScreenBase(by);
} catch (IOException e) {
throw new RuntimeException(e);
}
}
return element;
}