Skip to content

【实战练习】用户端App自动化测试实战

【实战练习】用户端 App 自动化测试实战

实战需求

点击查看实战详情

实现思路

uml diagram

编写 App 自动化测试脚本

  1. 梳理涉及到的相关页面,并在方法的返回值中明确页面的跳转关系。
# 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);
    }
}

  1. 编写测试用例,体现出来测试步骤,实现设置为空。
// 伪代码演示
searchRes = mainPage
        .gotoContactPage()
        .gotoPersonalInfoPage("张三10")
        .gotoPersonalConfigInfoPage()
        .gotoEditMemberPage()
        .deleteMember()
        .gotoSearchMemberPage()
        .searchMemberFail("张三10");
assert "没有找到相关结果" == searchRes
  1. 编写统一的前置后置动作。

  2. 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();
}
  1. 实现每个页面需要实现的操作与步骤。
  2. 优化测试框架,封装重复动作,目的是为了让测试框架更好用。

比如可以在做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;
}