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

Sutune · 2018年01月09日 · 最后由 Sutune 回复于 2018年01月10日 · 848 次阅读

问题描述

当前我是将断言和业务流程封装在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 条回复 时间 点赞

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

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

看习惯

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

chen 回复

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

恒温 回复

ok,谢谢指点。😀

Sutune 回复

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

Sutune 回复

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

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

Sutune #10 · 2018年01月10日 作者
周学习 回复

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

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