目录
一、接口自动化
1.框架结果
接口测试框架的结构说明
3.封装TPShop登录接口案例
login
4.登陆测试用例
logintestcase
run_suite
运行成功
生成报告
二、参数化处理
1.构造参数化
logintestcase
run_suite
data.json
运行成功
生成报告
三、db数据承载形式实现参数化
1.构造数据库数据
2.修改构造数据函数
一、接口自动化
1.框架结果
接口测试框架的结构说明
-- API用于封装被测的接口(用request模块封装的请求方法)
-- TestCase 将一个或者多个接口封装成测试用例,并使用UnitTest管理测试用例 TestCase 可以调用数据库进行数据的校验
-- 为了方便维护测试数据,可以把测试脚本和测试数据分离开
-- 通过UnitTest断言接口返回的数据,并生成测试报告
2.框架目录结构
apiTestframework 项目名称
|--- api package:定义封装被测系统的接口
|--- script package:定义测试用例脚本
|--- data dir:存放测试数据
|--- report dir:存放生成的测试报告
|--- lib package:存放第三方文件
|--- app.py 定义项目的配置信息
|--- utils.py 定义工具类
|--- run_suite.py 执行测试套件的入口
3.封装TPShop登录接口案例
按照功能模块定义封装被测系统的接口,方便测试脚本的调用,并且能够到达代码的复用。对登录功能的相关接口进行封装,示例代码:
login
class LoginApi(object):
# 初始化
def __init__(self):
self.verify_code_url = "xxx"
self.login_url = "yyyy"
# 登录过程
# 1.获取验证码
# 2.填写必要数据:用户名,密码,验证码
# 3.点击登录按钮
def get_login_verify_code(self, session):
return session.get(self.verify_code_url)
def login(self, session, username, password, verify_code):
data = {
"useername": username,
"password": password,
"verify_code": verify_code
}
return session.post(url = self.login_url, data=data)
4.登陆测试用例
将api模块中的一个或多个接口封装成一个测试用例,并使用测试框架UnitTest管理测试用例。定义登录功能的测试用例,示例代码:
logintestcase
import unittest
from requests import Session
from api.login import LoginApi
class LoginTest(unittest.TestCase):
@classmethod
def setUpClass(cls) -> None:
cls.login_api = LoginApi()
def setUp(self) -> None:
self.session = Session()
def tearDown(self) -> None:
self.session.close()
def test_login_success(self):
# 请求验证码
response = self.login_api.get_login_verify_code(self.session)
self.assertIn("image", response.headers.get("Content-Type"))
# 验证码识别
# 调用登陆方法,发送请求,获取相应数据
res = self.login_api.login(self.session, "13800000002", "123456", "8888")
# 断言
self.assertEqual(200, res.status_code)
self.assertEqual(1, res.get("status"))
self.assertEqual("登录成功", res.get("msg"))
run_suite
import unittest
from scripts import logintestcase
from HTMLTestRunner import HTMLTestRunner
suite = unittest.TestSuite()
suite.addTest(logintestcase.LoginTest("test_login_success"))
f = open("./report/report.html", 'wb')
runner = HTMLTestRunner(stream = f, title="lsjflsjfls", description="ksjfljsfjdsf")
runner.run(suite)
运行成功
import unittest
from scripts import logintestcase
from HTMLTestRunner import HTMLTestRunner
suite = unittest.TestSuite()
suite.addTest(logintestcase.LoginTest("test_login_success"))
f = open("./report/report.html", 'wb')
runner = HTMLTestRunner(stream = f, title="lsjflsjfls", description="ksjfljsfjdsf")
runner.run(suite)
运行成功
生成报告
二、参数化处理
1.构造参数化
logintestcase
import json
import unittest
from requests import Session
from parameterized import parameterized
from api.login import LoginApi
def build_data():
with open('./data/data.json', 'r', encoding='utf-8') as f:
content = f.read()
data = json.loads(content)
d = []
for i in data:
d.append((i['username'], i['password'], i['verify_code'], i['status'], i['msg']))
return d
class LoginTest(unittest.TestCase):
@classmethod
def setUpClass(cls) -> None:
cls.login_api = LoginApi()
def setUp(self) -> None:
self.session = Session()
def tearDown(self) -> None:
self.session.close()
@parameterized.expand(build_data)
def test_login_success(self, username, password, verify_code, status, msg):
# 请求验证码
response = self.login_api.get_login_verify_code(self.session)
self.assertIn("image", response.headers.get("Content-Type"))
# 验证码识别
# 调用登陆方法,发送请求,获取相应数据
res = self.login_api.login(self.session, username, password, verify_code)
# 断言
self.assertEqual(200, res.status_code)
self.assertEqual(status, res.get("status"))
self.assertEqual(msg, res.get("msg"))
run_suite
import unittest
from scripts import logintestcase
from HTMLTestRunner import HTMLTestRunner
suite = unittest.TestSuite()
suite.addTest(logintestcase.LoginTest("test_login_success"))
f = open("./report/report.html", 'wb')
runner = HTMLTestRunner(stream = f, title="lsjflsjfls", description="ksjfljsfjdsf")
runner.run(suite)
data.json
[
{
"username": "13800000002",
"password": "123456",
"verify_code": "8888",
"status": 1,
"msg": "登录成功"
},
{
"username": "138123456789",
"password": "123456",
"verify_code": "8888",
"status": 0,
"msg": "账号或者密码错误"
},
{
"username": "",
"password": "123456",
"verify_code": "8888",
"status": 0,
"msg": "账号或者密码错误"
},
{
"username": "13800000002",
"password": "",
"verify_code": "8888",
"status": 0,
"msg": "账号或者密码错误"
}
]
运行成功
生成报告
import json
import unittest
from requests import Session
from parameterized import parameterized
from api.login import LoginApi
def build_data():
with open('./data/data.json', 'r', encoding='utf-8') as f:
content = f.read()
data = json.loads(content)
d = []
for i in data:
d.append((i['username'], i['password'], i['verify_code'], i['status'], i['msg']))
return d
class LoginTest(unittest.TestCase):
@classmethod
def setUpClass(cls) -> None:
cls.login_api = LoginApi()
def setUp(self) -> None:
self.session = Session()
def tearDown(self) -> None:
self.session.close()
@parameterized.expand(build_data)
def test_login_success(self, username, password, verify_code, status, msg):
# 请求验证码
response = self.login_api.get_login_verify_code(self.session)
self.assertIn("image", response.headers.get("Content-Type"))
# 验证码识别
# 调用登陆方法,发送请求,获取相应数据
res = self.login_api.login(self.session, username, password, verify_code)
# 断言
self.assertEqual(200, res.status_code)
self.assertEqual(status, res.get("status"))
self.assertEqual(msg, res.get("msg"))
run_suite
import unittest
from scripts import logintestcase
from HTMLTestRunner import HTMLTestRunner
suite = unittest.TestSuite()
suite.addTest(logintestcase.LoginTest("test_login_success"))
f = open("./report/report.html", 'wb')
runner = HTMLTestRunner(stream = f, title="lsjflsjfls", description="ksjfljsfjdsf")
runner.run(suite)
data.json
[
{
"username": "13800000002",
"password": "123456",
"verify_code": "8888",
"status": 1,
"msg": "登录成功"
},
{
"username": "138123456789",
"password": "123456",
"verify_code": "8888",
"status": 0,
"msg": "账号或者密码错误"
},
{
"username": "",
"password": "123456",
"verify_code": "8888",
"status": 0,
"msg": "账号或者密码错误"
},
{
"username": "13800000002",
"password": "",
"verify_code": "8888",
"status": 0,
"msg": "账号或者密码错误"
}
]
运行成功
生成报告
三、db数据承载形式实现参数化
1.构造数据库数据
执行SQL脚本,将数据写入数据库中



