上一篇已经根据模块化封装的思想,构建了一个自动化测试的框架雏形,当然,还很简陋和杂乱,日后维护管理,查询报告和截图都很不方便。接下来,需要对不同的部分,建立不同的文件夹来分类管理。具体可以分成以下几个文件夹。
各个文件夹的作用,其实通过其名称便可理解。简要说明几个,baseView主要存放基类(相关定义见上一篇),businessView主要存放业务功能代码,也就是能实现要被测试的功能的代码,如登录功能,注册账户功能。common主要存放一些公共使用的代码,如公共使用的功能代码(弹窗检测和关闭,上下滑动屏幕,截图,生成时间戳等),读取appium服务器和app启动配置,以及日志采集配置的的代码,测试环境的准备和还原的代码。data文件夹主要放置用于测试的一些数据,如测登录功能的账户密码数据(以数据来驱动测试流程),test_case用于存放不同功能的测试脚本,即上一篇最后提到的利用unittest模块编写的测试用例。test_run文件夹存放最终运行的脚本,引入了BSTestRunner模块,可以生成测试报告,统计测试通过率等。而z_bat script则放入创建的bat脚本,可以通过cmd命令窗口来运行test_run里面的测试执行文件。
按照这样的结构分好类,将各自对应的代码,配置文件放入。一个更为清晰明朗的自动化测试框架就搭好了。当然,相比于上一阶段,代码里需要针对这样的架构进行一些修改,主要集中在文件读取方式,路径,日志、截图存储路径的变动方面。当然也新增了一些代码,如生成测试报告等。具体如下
- test_case测试用例脚本里,使用了unittest模块里的断言方法,assertTrue(),如果其参数为True,则该方法执行后的值为True,反之,则为False。这个方法一般用来判断测试用例的执行结果是pass还是fail。为了达到能判断的效果,在编写测试用例时,需要在适当的地方(或情形) return True或False,作为用例执行后的返回值。
以kyb APP的注册功能为例,当在业务功能脚本里写好注册功能后,增加了以下代码来判断注册是否成功(通过检测对应的界面元素)以及给与合适的返回值
# 判断是否进入到完善信息界面
try:
self.driver.find_element(*self.perfectinfomation_school)
except NoSuchElementException:
logger.error('register Fail!')
self.getScreenshot('register Fail')
return False
else:
self.add_register_info()
# 注册结果判断
if self.check_register_status():
return True
else:
return False
其中,check_register_status()方法实现如下:
def check_register_status(self):
self.check_Ad()
logger.info('====check_registerStatus====')
try:
self.driver.find_element(*self.button_myself).click()
self.driver.find_element(*self.username)
except NoSuchElementException:
logger.error('register Fail!')
self.getScreenshot('register_Fail')
return False
else:
logger.info('register success!')
self.getScreenshot('register_success')
return True
- test_run里用于执行测试用例并生成测试报告
import sys #此3行代码,是为了用bat脚本运行此代码时避免出现找不到import的模块的错误。因为cmd是在工程目录来运行,import模块时会首先在python PATH的环境变量中查找
path = 'C:\DISK_D\Python learning\Coding Work\Appium auto test\level_4'
sys.path.append(path)
from BSTestRunner import BSTestRunner
import unittest
import time
from common.desired_caps import logger
#指定测试用例和测试报告的路径
test_dir = '../test_case'
report_dir = '../reports'
#加载测试用例
discover = unittest.defaultTestLoader.discover(test_dir, pattern='test_register.py')
#定义报告的文件格式和名称
now = time.strftime("%Y-%m-%d %H_%M_%S")
report_name = report_dir + '/' + now + ' test_report.html'
#运行用例并生成测试报告
with open(report_name, 'wb') as f:
runner = BSTestRunner(stream=f, title="Kyb Test Report", description="kyb Andriod app Test Report")
logger.info("start run testcase...")
runner.run(discover)
- 执行测试的bat脚本
@echo off
c:
cd C:\DISK_D\Python learning\Coding Work\Appium auto test\level_4\test_run
C:\Users\Evan\AppData\Local\Programs\Python\Python38\python.exe run_test.py
pause