当fixture超出范围时(即fixture返回值后,仍有后续操作),通过使用yield语句而不是return,来将值返回(因为return后,说明该函数/方法已结束,return后续的代码不会被执行),如下:
@pytest.fixture(scope="module") def smtpConnection(): smtp_connection = smtplib.SMTP("smtp.gmail.com", 587, timeout=5) yield smtp_connection # 返回 fixture 值smtp_connection print("teardown smtp") smtp_connection.close()无论测试的异常状态如何,print和close()语句将在模块中的最后一个测试完成执行时执行。
可以使用with语句无缝地使用yield语法(with语句会自动释放资源)
@pytest.fixture(scope="module") def smtpConnection(): with smtplib.SMTP("smtp.gmail.com", 587, timeout=5) as smtp_connection: yield smtp_connection # 返回smtp_connection对象值测试结束后, 连接将关闭,因为当with语句结束时,smtp_connection对象会自动关闭。
关联详解公共关联池:意思就是你可以存储接口的响应值到参数池中,以便后续接口使用;同时也可以在测试执行前,制造一些公共关联值,存储到参数池中,供所有的接口使用;
在yaml测试用例中,可通过填写关联键relevance提取响应字段的键值对到参数池中;当提取单个关联值时,关联键relevance的值为字符串,形如relevance: positon;当提取多个关联值时,关联键relevance的值为列表,同时也可提取响应信息中嵌套字典里的键值对;
引用已经存储的关联值:在下个接口入参中使用形如 ${key}$ 的格式,即可提取参数池中的key对应的value,当然你必须保证关联池中已经存储过该key。
函数助手详解说明:函数助手是来自Jmeter的一个概念,有了它意味着你能在yaml测试用例或者其他配置文件中使用某些函数动态的生成某些数据,比如随机定长字符、随机定长整型数据、随机浮点型数据、时间戳(10位和13位)、md5加密、SHA1、SHA256、AES加解密等等,引用的格式为 $Function(arg)$
目前支持的函数助手:
$MD5(arg)$ =========》 md5加密字符串,arg为待加密的字符串,可传入多个字符串拼接后加密,多个字符串之间用逗号隔开,形如$MD5(asd, we57hk)$
$SHA1(arg)$ ==========》 SHA1加密字符串,arg为待加密的字符串,可传入多个字符串拼接后加密,多个字符串之间用逗号隔开
$SHA256(arg)$ ==========》 SHA256加密字符串,arg为待加密的字符串,可传入多个字符串拼接后加密,多个字符串之间用逗号隔开
$DES(arg, key)$ ==========》 DES加密字符串,arg为待加密的字符串
$AES(arg, key, vi)$ ==========》 AES加密字符串,arg为待加密的字符串
$RandomString(length)$ =========》 生成定长的随机字符串(含数字或字母),length为字符串长度
$GetTime(time_type=now,layout=13timestamp,unit=0,0,0,0,0)$ =========》 生成定长的时间戳,time_type=now表示获取当前时间,layout=13timestamp表示时间戳位数为13位,unit为间隔的时间差
代码设计与功能说明 1、定义运行配置文件 runConfig.yml该文件主要控制测试的执行方式、模块的功能开关、测试用例的筛选、邮件的配置以及日志的配置,具体如下:
runConfig.yml配置信息 # 自动生成测试用例开关,0 -关, 1 -开,根据接口数据自动生成测试用例和单接口执行脚本; 2 -开,根据手工编写的测试用例,自动生成单接口执行脚本 writeCase_switch: 0 # 本次自动生成的测试用例归属的功能模块(项目名称/功能模块)比如: /icmc/pushes ;若不填,则默认不归类 ProjectAndFunction_path: /icmc/pushes # 扫描用例路径(相对于TestCases的相对路径),以生成执行脚本;若不填,则默认扫描所有的测试用例(只有自动生成测试用例开关为 2 时,此字段才有效),如 /icmc/pushes scan_path: # 执行接口测试开关,0 -关, 1 -开 runTest_switch: 1 # 从上往下逐级筛选 # 待执行项目 (可用表达式:not、and、or)(项目名最好唯一,若多个项目或测试名的前缀或后缀相同,则也会被检测到;检测规则为“包含”) Project: tests # 待执行接口,可运行单独接口(填接口名),可运行所有接口(None或者空字符串时,即不填),挑选多接口运行可用表达式:not、and、or ,如 parkinside or GetToken or company markers: # 本次测试需排除的产品版本(列表),不填,则默认不排除 product_version: # 本次测试执行的用例等级(列表),不填,则默认执行所有用例等级;可选[\'blocker\', \'critical\', \'normal\', \'minor\', \'trivial\'] case_level: - blocker - critical - normal - minor # isRun开关,0 -关, 1 -开 ;关闭时,则用例中的is_run字段无效,即会同时执行is_run为 False 的测试用例 isRun_switch: 1 # 用例运行间隔时间(s) run_interval: 0 # 本轮测试最大允许失败数,达到最大失败数时,则会立即结束当前测试 maxfail: 20 # 测试结束后,显示执行最慢用例数(如:3,表示显示最慢的三条用例及持续时间) slowestNum: 3 # 失败重试次数,0表示不重试 reruns: 1 # 失败重试间隔时间(s) reruns_delay: 0.1 #发送测试报告邮件开关, 0 -关, 1 -开 emailSwitch: 0 #邮件配置 #发件邮箱 smtp_server: smtp.126.com server_username:XXXX@126.com server_pwd: XXXXX #收件人(列表) msg_to: - XXX@163.com - XXX@qq.com #邮件主题 msg_subject: \'[XX项目][测试环境-develop][jira号][接口自动化测试报告]\' #日志级别(字典),由高到低: CRITICAL 、 ERROR 、 WARNING 、 INFO 、 DEBUG log: backup: 5 console_level: INFO #控制台日志级别 file_level: DEBUG #文件日志级别 pattern: \'%(asctime)s - %(filename)s [line:%(lineno)2d] - %(levelname)s: %(message)s\' 2、接口配置文件 apiConfig.ini [host] host = 127.0.0.1:12306 MobileCodeWS_host = ws.webxml.com.cn WeatherWebService_host = [header] header1 = {"Content-Type": "application/json"} header2 = {"Content-Type": "application/json;charset=UTF-8"} header3 = {"Content-Type": "application/json", "description": "$RandomString(10)$", "timestamp": "$GetTime(time_type=now,layout=13timestamp,unit=0,0,0,0,0)$", "sign": "$SHA1(${description}$, ${timestamp}$)$"} [MySqlDB] host = localhost port = 3306 user = root pwd = root db = course charset = utf8