自动化测试流程
自动化测试主要执行阶段:
- 冒烟测试(主流程是否能正常运行)
- 回归测试(修复bug之后,测试功能是否正常,是否会影响其他模块)
- 持续集成
要在进行过1次以上的手工测试,熟悉业务流程和模块功能之后,才进行自动化测试
需求分析
一个项目接到手之后,我们需要进行需求分析
- 需求文档,功能展示以及交互
- 接口文档,后端数据是怎么跟前端进行传输
-纸质(电子)
-open api(网站)
-抓包(没有接口文档的时候,需要自己抓包查看请求需要的参数)
项目前缀:一个服务器/端口下,有多个子项目
接口文档会说明响应体的一些字段,还有请求头必须的参数,请求体传入参数的格式
还会对每一个接口进行详细的说明
3.数据库账号,地址,数据结构能熟悉整个项目的轮廓,字段,数据表之间的关联
4.测试环境,环境搭建
5.原型图,逻辑图
测试计划
主要由项目经理完成
-可行分析
-风险因素
-时间管控
-技术
-测试优先级
-是否需要自动化(哪些场景,功能)
测试用例
这里的测试用例是指自动化测试需要的数据,需要手工提取
任何一个项目或者是新功能,会先进行手工测试,也是要进行全量的用例编写,然后用工具手工执行一遍
如:每一条接口,每一组测试数据,都手工用postman进行访问,然后把数据记录在excel当中
用例数据可以根据需求文档,接口文档的要求,用等价类,边界值等测试方法获取.如:
得到数据后,通过手工测试得到用例,写入excel
或者通过抓包,postman等调试工具,得到用例数据和预期结果,写入测试用例
json数据一定要符合规范.使用双引号
接口用例:最好一个接口一个表单,不要把多个接口都写入同一个表单,方便管理
手工测试告一段落,目前为止还没开始自动化
手工测试完一遍,收集完用例之后,就开始准备编写自动化脚本
执行:编写自动化测试用例
-首先验证自动化测试程序是否能正常运行,先把功能实现
-写一个单独的自动化测试用例函数.test_,需要有请求发送,得到相应结果.断言,生成报告
- 准备测试数据
- 发送请求接口,得到实际结果
- 断言,预期结果和实际结果
import unittest
import requests
class TestRegister(unittest.TestCase):
def test_register_1(self):
#准备测试数据
method = "POST"
url = r"http://api.lemonban.com:8766/futureloan/member/register"
headers = {"X-Lemonban-Media-Type": "lemonban.v2"}
json_data = {"mobile_phone": "", "pwd": "123"}
expected = {
"code": 1,
"msg": "手机号为空",
"data": None,
"copyright": "Copyright 柠檬班 © 2017-2020 湖南省零檬信息技术有限公司 All Rights Reserved"
}
#访问接口,得到实际结果
response = requests.request(url=url,method=method,headers=headers,json=json_data)
actual = response.json()
#断言
self.assertEqual(expected,actual)
def test_register_2(self):
# 准备测试数据
method = "POST"
url = r"http://api.lemonban.com:8766/futureloan/member/register"
headers = {"X-Lemonban-Media-Type": "lemonban.v2"}
json_data = {"mobile_phone": "151", "pwd": "123"}
expected = {
"code": 2,
"msg": "密码格式为8到16位",
"data": None,
"copyright": "Copyright 柠檬班 © 2017-2020 湖南省零檬信息技术有限公司 All Rights Reserved"
}
# 访问接口,得到实际结果
response = requests.request(url=url, method=method, headers=headers, json=json_data)
actual = response.json()
# 断言
self.assertEqual(expected, actual)
脚本的基本功能能够实现,运行能够成功之后,才开始引入ddt,ddt适用场景:数据不同,测试步骤一样,接口测试比较吻合
优化代码,实现DDT
1.准备框架需要的文件夹和包,把相应的文件放入
2.导入相应的模块和函数
--导入unittest,requests(单元测试框架,接口框架)
import unittest import requests
-导入所需的函数,read_excel(读取excel数据),ddt,list_data(参数化),get_log(日志)
from common.read_excel import read_excel from unittestreport import ddt,list_data from common.get_logging import get_log
-导入函数所需要的文件路径(动态路径)
from config.config import case_file,host,log_1_file
-导入json转换字典(反序列化)所需要的库
import json
3.得到测试数据(读取excel)
通过config里得到excel的动态路径,还有表单名称
#获取测试数据 data1 = read_excel(case_file,"register")
4.实现参数化
#参数化
@ddt
class TestRegister(unittest.TestCase):
@list_data(data1)
def test_register(self,test_data):
变量名称不要冲突
5.获取数据
@ddt
class TestRegister(unittest.TestCase):
@list_data(data1)
def test_register(self,test_data):
#准备测试数据
my_logger.info(f"正在测试{test_data['title']}")
method = test_data["method"]
url_address = test_data["url"]
#将json格式的字符串转换成字典
headers = json.loads(test_data["headers"])
json_data = json.loads(test_data["json"])
expected = json.loads(test_data["expected"])
#访问接口,得到实际结果
response = requests.request(url=f"{host}{url_address}",method=method,headers=headers,json=json_data)
actual = response.json()
注意:
从excel读取的headers,json,expected的数据格式都是json格式的字符串,所以要通过反序列化转换成字典,才能传入访问接口的参数
我们还需要把域名(host)单独存放到配置文件中,因为测试环境有可能会改变,比如域名和端口改变,而接口地址基本不会变,如果以后端口或者域名改变,我们只需要修改配置文件就可以了
6.断言
#断言
try:
self.assertEqual(expected,actual)
my_logger.info("测试用例通过")
except AssertionError as e:
my_logger.error("测试用例不通过")
raise e
finally:
my_logger.info("测试完成")
我们在设计框架的时候,难免会遇到各种各样的问题,导入数据失败,函数运行失败等报错,要熟练运用断点来查看问题的原因
-程序报错,从报错信息中查看error message
-找到报错行,报错信息中自己写的文件,点击链接定位到报错行号
-断点打在可能报错的行数或者早于该行
完整的项目代码:
import unittest
import requests
from config.config import case_file,host,log_1_file
from common.read_excel import read_excel
from unittestreport import ddt,list_data
from common.get_logging import get_log
import json
#获取测试数据
data1 = read_excel(case_file,"register")
#获取log
my_logger = get_log(log_1_file)
#参数化
@ddt
class TestRegister(unittest.TestCase):
@list_data(data1)
def test_register(self,test_data):
#准备测试数据
my_logger.info(f"正在测试{test_data['title']}")
method = test_data["method"]
url_address = test_data["url"]
#将json格式的字符串转换成字典
headers = json.loads(test_data["headers"])
json_data = json.loads(test_data["json"])
expected = json.loads(test_data["expected"])
#访问接口,得到实际结果
response = requests.request(url=f"{host}{url_address}",method=method,headers=headers,json=json_data)
actual = response.json()
#断言
try:
self.assertEqual(expected,actual)
my_logger.info("测试用例通过")
except AssertionError as e:
my_logger.error("测试用例不通过")
raise e
finally:
my_logger.info("测试完成")



