- web自动化脚本:
- 层次分明:页面元素层、业务流层、控件层、用例层 //好处:数据驱动、脚本维护方便(如果只是页面的某个元素变化只需要修改元素层内容;如果只是业务逻辑有调整,只要修改业务层内容;如果要增加测试场景,只需在用例处新增输入及预期结果即可)
- 层次分明:页面元素层、业务流层、控件层、用例层 //好处:数据驱动、脚本维护方便(如果只是页面的某个元素变化只需要修改元素层内容;如果只是业务逻辑有调整,只要修改业务层内容;如果要增加测试场景,只需在用例处新增输入及预期结果即可)
- 剥离出脚本统一在一个地方维护:
- 环境信息:ip、port、ssh连接信息、数据库连接信息
- 帐号密码信息
- 测试文件/数据:用例中用到的测试文件、测试数据统一放在一个目录,作为公用,其它用例也可一起用,避免准备多份数据占用空间、维护麻烦等
- 配置信息
- 大部分脚本要用到的配置或者参数
- 一个项目最好要有code、lib、config、testfile等目录,归类存放、维护
- code:自动化脚本/用例
- lib:封装的各类公用方法、文件/数据处理方法、业务相关方法等
- config:配置信息、环境信息、帐号密码信息、url等
- testfile:测试文件/数据等
- 脚本里尽量不要用固定等待的方式,比如要等到某个定时器或者某个异步任务执行完成才进行下一步,不用sleep 60类似的方式!!采用浮动等待的方式(好处:脚本精确等待任务执行完成不会耗时过长;脚本稳定)
示例如下:
-
def wait_until_expect_mgr_status(url, persistent_id, interval=3, max_waittime=10, expect_status='fileOperateSucceedAndReturnPersistentSucceed',after_waittime=0): """ 浮动等待http://27.148.167.201/status/get/prefop?persistentId=ahd01066a121cd4c00001b94a7c906651090返回最后一个子任务的status字段为期望值(省去强制等待较长时间的问题) :param url: 请求的url :param persistent_id: persistet_id :param interval: 每个等待周期间隔时间 :param max_waittime: 最大允许等待的时间 :param expect_status: status字段的期望值 :param after_waittime: 字段变为期望值之后,再强制等待的时间,配合“定时器5s查询一次子任务状态,然后更新主任务状态” :return: None """ wait_time = 0 times = int(max_waittime/interval) url = url + '?persistentId=' + persistent_id print ('请求URL:%s' % url) for i in range(0,times): rq = requests.get(url) get_status = json.loads(rq.text).get('items')[0].get('desc') if get_status == expect_status: print u' Success. 当前状态(%s)和期望的状态(%s)一致,当前等待总时长:%s' % (get_status, expect_status, wait_time) time.sleep(after_waittime) return time.sleep(interval) wait_time = wait_time + interval print u'当前状态(%s)和期望的状态(%s)不一致,已等待总时长:%s' % (get_status, expect_status, wait_time) print u" Error. 当前状态(%s)和期望的状态(%s)不一致,已到达允许等待最大时长:%s" % (get_status, expect_status, max_waittime) raise AssertionError(u"Fail.")
- 1