pycharm相关设置:
1.左侧字体:设置 - Appearance & Behavior - Appearance - Theme选择Intellij为白色,勾选第2个,选18号
2.代码大小:Editor - Colors & Fonts - Font - Scheme选择Default为白色,字号设置26
3.运行结果大小:Editor - Colors & Fonts - Console font ,字号设置26
4.解释器:Project xx - Project Interpreter
json和字典的主要区别:
1. 字典是一种数据结构,类型是dict,json是一种数据格式,类型是字符串
2. 字典的键不能重复,json的键可以重复
3. 字典的键可以是字符串,数字,元组,json的键只能为字符串
4. 字典的字符串可以用单引号或双引号,json的字符串强制用双引号
5. 字典可以嵌套元组,json不能嵌套元组
6. 字典的布尔值首字母大写,空是None,json布尔值都是小写,空是null;
安装requests,使用命令 pip install requests,
若在线安装失败,则使用以下镜像命令安装:
pip install requests -i http://pypi.douban.com/simple --trusted-host pypi.douban.com
1.Python接口入门练习
课件\09_接口测试\python+requests库的接口自动化测试.docx
www.pingan.com/cms-tmplt/pinganlife/synShopList.do
参数dateUpdated:2017-12-02
平安接口是2017-12-02有数据,2020-06-09能跑,2010-06-09不能跑
2.单元测试框架
执行单个用例setUp()、tearDown()
执行批量用例setUpClass()、tearDownClass() ,注意加装饰器@classmethod
完整示例代码如下:
import unittest,requests,ddt
@ddt.ddt
class MyTest(unittest.TestCase):
@classmethod
def setUpClass(self):
pass
@classmethod
def tearDownClass(self):
pass
@ddt.data({"name":"juzi","expectResult":1},
{"name":"juzi2","expectResult":2})
# @ddt.file_data("testData.json")
@ddt.unpack
def testCase(self,name,expectResult):
print(name,expectResult)
actualResult = '12啊'
#断言
self.assertIn(str(expectResult),actualResult)
if __name__ == "__main__":
unittest.main()
3.用例断言
self.assertEqual(expectResult,actualResult)
self.assertIn(expectResult,actualResult)
4. ddt数据驱动模块相关
在线安装:pip install ddt
若在线安装失败,则使用以下镜像安装:
pip install ddt -i http://pypi.douban.com/simple --trusted-host pypi.douban.com
ddt使用方式:方法前面加@
ddt常用方法:
ddt.ddt 在类前面进行声明ddt
ddt.data() 引入测试数据ddt.data(),括号里面的数据可以封装成字典格式,不加引号,
单条数据如@ddt.data({"name":"juzi","resultCode":"0"})
多条数据如@ddt.data({"name":"juzi","resultCode":"0"},
{"name":"juzi2","resultCode":"22"})
ddt.unpack 将测试数据分解。如果引入的是参数文件 ddt.file_data(),则分解可以省略
ddt.file_data() 引入外部参数(测试数据文件),括号里面是引号,引号里面是.json文件
注意:ddt引入数据、分解数据,都在测试用例上面,即def testCase()上面,
引入数据(如{"name":"tom","expectCode":"0"})的所有变量名name、expectCode都要放在testCase()里面,
即testCase(self,name,expectCode)
注:json文件格式,需要用双引号:
{
"testCase01":{"username":"juzi8","expectResult":"msg\":\"invalid username/password combination\""},
"testCase02":{"username":"juzi9","expectResult":"msg\":\"invalid username/password combination9\""}
}
5.接口自动化用例设计
课件\09_接口测试\01_http接口\http协议接口测试课堂练习.docx
6.完整的项目接口自动化
课件\09_接口测试\Br_Api.docx
课件\09_接口测试\Br_Api接口(数据库信息).txt
服务器地址:211.149.163.145
用户名:br_api
数据库密码:z2CGg7s6P7
端口:3306
数据库:br_api
4-1.创建项目文件夹,如:br_api接口自动化,
在该文件夹下创建同级子文件夹testCases、public、reports;
4-2.在public文件夹下创建public.py,封装成公共部分;
4-3.在testCases文件夹下创建相关用例文件(注册、登录等),
如:1.新用户注册.py 2.登录接口.py 3.创建任务接口.py ;
4-4.如果需要参数化,则继续在testCases文件夹下创建对应的参数化json文件;
4-5.如果需要批量执行自动化用例,把runAllCases.py复制到项目文件夹下,
即:放到br_api接口自动化下面
4-6.使用runAllCases.py,需要把HTMLTestRunner.py复制到Python安装文件夹
下的lib文件夹下;
4-7.注意runAllCases.py文件里面,16行的发件人可以写自己邮箱,18行的收件人可以
写项目领导邮箱,27行的邮件标题注意改成所做的项目,38行的邮箱登录授权码(可百度),
注意60行、65行的路径,78行的标题
7.使用Jenkins持续集成
创建定时任务:
0 20 * * *
批处理命令:
D:
cd workspace\br_api接口自动化
python runAllCases.py
8.注意事项
1.testCases里面的用例名称最好为英文,否则reports里面的报告无数据
2.testCases里面的参数化文件最好与用例名称一致,方便查看
3.如果需要按顺序执行用例,用例名称可以以test_1_register、test_2_login命名,
或以test1_register、test2_login命名
4.需要将HTMLTestRunner.py文件复制到Python安装目录的lib文件夹下
5.新版ddt.file_data方法需要修改ddt.py文件249行左右,将utf-8修改为gbk,否则不支持中文
6.注意函数名和变量名不要重复,如token = token()这种情况会报错
9. unittest单元测试框架总结:
# 1. setup()、teardown(),每条用例执行前后都要运行一次,适用于一条用例,多条用例耗费时间
# 2. setUpClass()、tearDownClass(),所有用例执行前后总共运行一次,适用于批量执行用例
# 3. 测试用例的执行顺序依据用例名称顺序执行
# 4. 自动化测试脚本必须要有环境恢复(删除存入数据库的内容等)
# 5. 环境恢复放在用例后,但自动化脚本的环境恢复代码可以紧跟在环境预置之后,不影响执行顺序
10.补充(了解即可):
使用ddt.file_data("data.yaml"),需要先安装pip install pyyaml
data.yaml里面内容有如下两种写法(注意参数后面有一个空格):
test01:
username: 'juzi01'
password: 123456
password_confirmation: 123456
expectResult: '"username":"juzi01"'
test02:
username: 'juzi02'
password: 123456
password_confirmation: 123456
expectResult: '"username":"juzi02"'
对应脚本写法:
@ddt.file_data('data.yaml')
@ddt.unpack
def testCase(self,username,password,password_confirmation,expectResult):
parms = {"username":username,"password":password,"password_confirmation":password_confirmation}
res = requests.post(self.url,parms)
#print(res.text)
#print(expectResult)
self.assertIn(expectResult,res.text)
或:
test01:
parms:
username: juzi03
password: 123456
password_confirmation: 123456
expectResult: '"username":"juzi03"'
test02:
parms:
username: juzi04
password: 123456
password_confirmation: 123456
expectResult: "\"username\":\"juzi04\""
对应脚本写法:
@ddt.file_data('data.yaml')
@ddt.unpack
def testCase(self,parms,expectResult):
res = requests.post(self.url,parms)
#print(res.text)
#print(expectResult)
self.assertIn(expectResult,res.text)