Appium Page Object 模式断言是否应该包含在 Page 对象中?

shuqing2017 · 发布于 2018年01月09日 · 最后由 shuqing2017 回复于 2018年01月10日 · 331 次阅读

问题描述

当前我是将断言和业务流程封装在page对象之中,然后在unittest直接去调用对应的方法执行,没有单独使用unittest的assert断言。部分代码所下所示:

page 层-DeepRecoveryView

class DeepRecoveryView(RecycleBinView,BasicRecoveryView):
    btnDeepRecovery=(By.ID,'com.wondershare.drfone:id/btnDeepRecovery')
    nextBtn=(By.ID,'com.wondershare.drfone:id/btnRecoverData')
    try_DeeprecoverBtn=(By.ID,'com.wondershare.drfone:id/onePageTxt')


    dialog_ok=(By.ID,'com.wondershare.drfone:id/dialog_ok')
    btnHideDeepRecovery=(By.ID,'com.wondershare.drfone:id/btnHideDeepRecovery')

    def deep_recover_h5_action(self):
        ''' 扫描完成后下一步进行发送邮件操作'''

        # 等待next按钮出现
        WebDriverWait(self.driver, 20).until(lambda x: x.find_element(*self.nextBtn_loc))
        #点击next按钮
        self.find_element(*self.nextBtn_loc).click()
        self.type_h5_action()

    def check_recycleBin(self):
        '''
        检测扫描结果页面是否存在资源
        :return: True,False
        '''
        try:
            self.find_element(*self.imageBtn)
        except NoSuchElementException:
            logging.info('No resource')
            return False
        else:
            logging.info('Resource exist!')
            return True

    def deepRecovery_from_recycleBin(self):
        '''
        从recycle bin进入
        '''
        self.open_recycleBin_page()
        #如果存在资源则直接点击资源下方的Banner菜单,没有资源则点击界面文字“Deep recobery”
        logging.info('========deepRecovery_from_recycleBin==========')

        if self.check_recycleBin():
            #点击页面下方banner栏恢复
            self.getScreenShot('deepRecovery_from_recycleBin')
            self.find_element(*self.try_DeeprecoverBtn).click()
            self.deep_recover_h5_action()
        else:
            #点击页面深度恢复文字提示
            self.getScreenShot('deepRecovery_from_recycleBin')
            self.find_element(*self.btnDeepRecovery).click()
            self.deep_recover_h5_action()

        #退出到主界面
        for i in range(3):
            self.find_element(*self.closeBtn).click()

    def deepRecover_from_RecoverMenu(self):
        '''
        从Recovery 主菜单页面 进入
        '''
        logging.info('============= deepRecover_from_RecoverMenu =============')
        #进入recover界面主页
        self.find_element(*self.basic_recoveryBtn).click()
        self.getScreenShot('deepRecover_from_RecoverMenu')
        #点击deep recovery
        self.find_element(*self.btnDeepRecovery).click()
        self.deep_recover_h5_action()

        # 退出到主界面
        for i in range(3):
            self.find_element(*self.closeBtn).click()

    def deepRecover_from_quickRecover(self):
        '''
        #从quickRecovery 进入
        '''
        logging.info('===============deepRecover_from_quickRecover============')
        self.open_quickRecover_page()
        if self.check_quickRecover_resource():
            #如果存在资源向上滑动屏幕
            self.swipeUp()
            self.find_element(*self.btnHideDeepRecovery).click()
            self.getScreenShot('deepRecover_from_quickRecover')
            self.deep_recover_h5_action()

        else:
            # 没有资源点击页面深度恢复文字提示
            logging.info('start click btnDeepRecovery')
            self.getScreenShot('deepRecover_from_quickRecover')
            self.find_element(*self.btnDeepRecovery).click()
            self.deep_recover_h5_action()

        # 退出到主界面
        for i in range(4):
            self.find_element(*self.closeBtn).click()

unittest

class TestDeepRecovery(StartEnd):
    @tag(Tag.DR,Tag.SMOKE,Tag.DR_High)
    def test_deepRecovery_from_recycleBin(self):
        """从recycleBin入口恢复"""
        deep=DeepRecoveryView(self.driver)
        deep.deepRecovery_from_recycleBin()

    @tag(Tag.DR,Tag.SMOKE,Tag.DR_High)
    def test_deepRecover_from_RecoverMenu(self):
        """从Recover主菜单恢复"""
        deep=DeepRecoveryView(self.driver)
        deep.deepRecover_from_RecoverMenu()

但是看到一种说法说这样会 混合访问页面数据和断言逻辑的职责,导致page层过于臃肿,不应当在page层中包含断言,不知大家是如何设计断言的?

共收到 10 条回复
7f7f12

我的理解是page就是page,断言还是放case里面吧

5837

没啥应该不应该,看具体情况和个人习惯。如果重复asster写很多为啥不封装呢?具体怎么封装就看个人习惯和要求了。

110

看习惯

14742
7f7f12alexchn 回复

业务流程比较简单放case里面其实还是可以的,但是业务流程场景比较复杂的话放case有点不太方便。

14742
5837taflo 回复

嗯,这个得根据项目实际情况来处理。

14742
110Lihuazhang 回复

ok,谢谢指点。😀

110
14742shuqing2017 回复

我喜欢把断言放在测试用例里,把页面逻辑放在po里

7f7f12
14742shuqing2017 回复

理论上来说,一些assertion放到page里面,多cases调用相同方法的时候,会少很多事,但是我觉得case还是应该就是case,page就是page。当然了,主要还是习惯了,只要你们团队认可就行了,主要还是团队好执行好写即可

8d5594

个人习惯,功能测试用例管输入和输出,所以断言在用例,page管流程(方法)和页面元素(属性),这是比较面向对象的对象,当然,这个看具体要求吧,怎么方便怎么做

14742
8d5594terrychow 回复

嗯,断言在用例里面还有一个好处就是生成的html报告对应的测试结果Pass,Fail会比较直观的展示,而放在page层就比较笼统,只有脚本运行出错才会显示对应报错信息。

需要 登录 后方可回复, 如果你还没有账号请点击这里 注册