tep
,try easy pytest。python tep
:项目脚手架
pytest用例组织
输出HTML测试报告
基于fixture管理环境变量
基于fixture共享公共函数
访问MySQL数据库
集成常用第三方包
登录接口示例代码
pip
命令安装:pip install tep
pandas
可能安装失败,推荐用国内镜像:pip --default-timeout=6000 install -i https://pypi.tuna.tsinghua.edu.cn/simple tep
Python版本 3.6+
tep -V
0.5.3
tep --version
0.5.3
-U
参数:pip install -U tep
pip install tep==0.5.3
startproject
命令快速创建项目:cd some_directory
tep startproject project_name
当前版本主要用来做接口自动化,建议把不同业务系统建成多个项目。
fixtures\fixture_admin.py
,修改2个地方的代码,就可以完成登录请求。fixtures/fixture_admin.py
:@pytest.fixture(scope="session")
def env_vars(config):
class Clazz:
def __init__(self):
env = config["env"]
self.mapping = {
"qa": {
"domain": "https://qa.com",
"mysql_engine": mysql_engine("127.0.0.1", # host
"2306", # port
"root", # username
"123456", # password
"test") # db_name
},
"release": {
"domain": "https://release.com",
"mysql_engine": mysql_engine("127.0.0.1",
"2306",
"root",
"123456",
"release")
}
# Add your env and variables
}
self.domain = self.mapping[env]["domain"]
self.mysql_engine = self.mapping[env]["mysql_engine"]
# Add properties
def add(self, env, key, value):
self.mapping[config["env"]][key] = value
return Clazz()
mapping
是个字典,预置了2个环境:qa
和release
,每个环境预置了2个变量:domain
和mysql_engine
。url = domain +uri
,例如https://qa.com/api/users/login/
的domain是``https://qa.com,uri是
/api/users/login/`。qa
环境的domain
值改为你的测试域名。fixtures/fixture_admin.py
:def _jwt_headers(token):
return {"Content-Type": "application/json", "authorization": f"Bearer {token}"}
@pytest.fixture(scope="session")
def login():
# Code your login
logger.info("Administrator login")
response = request(
"post",
url=url("/api/users/login/"),
headers={"Content-Type": "application/json"},
json={
"username": "admin",
"password": "123456",
}
)
assert response.status_code < 400
response_token = jmespath.search("token", response.json())
class Clazz:
token = response_token
jwt_headers = _jwt_headers(response_token)
return Clazz
# Code your login
处开始修改代码,替换API路径/api/users/login/
和请求参数json
。如果你的登录接口不会返回token,那么修改jmespath.search("token", response.json())
为实际响应取值。tep预置登录返回了2个值: token
和jwt_headers
。
tests/login_test.py
:from loguru import logger
def test_login(login):
logger.info(login.token)
遇到问题无法解决请留言或加群。
tests
目录下:.py
模块以test_
前缀或_test
后缀命名,每个test
函数以test
前缀命名。只要遵循这个规则,目录层次不影响。示例:建议每个 .py
模块只包含1个test
函数,也就是1条测试用例。
tests/post_test.py
:import jmespath
from loguru import logger
from tep.client import request
def test_post(faker_ch, url, login):
# description
logger.info("test post")
# data
fake = faker_ch
# request
response = request(
"post",
url=url("/api/users"),
headers=login.jwt_headers,
json={
"name": fake.name()
}
)
# assert
assert response.status_code < 400
# extract
user_id = jmespath.search("id", response.json())
借鉴了JMeter元件和参数化关联的设计思想。
from tep.client import request
,tep.client.request
对requests.request
除了记录日志外,没有做任何修改。如果请求报错了,那么很可能是代码写错了。
request
,from requests import request
。request("get", url="", headers={}, json={})
request("post", url="", headers={}, params={})
request("put", url="", headers={}, json={})
request("delete", url="", headers={})
# 上传excel
request("post",
url="",
headers={},
files={
"file": (
file_name,
open(file_path, "rb"),
"application/vnd.openxmlformats-officedocument.spreadsheetml.sheet"
)
},
verify=False
)
更多用法参考 requests.request
。
assert 表达式
,表达式跟if
语句表达式一模一样。jmespath
提取JSON数据,也可以使用Python[]
中括号提取。Terminal
,输入命令来执行:# 先进入tests目录
cd tests
# 批量执行
pytest
pytest --co
--tep-reports
参数来生成allure测试报告:pytest --tep-reports
reports/
中:index.html
选择:默认allure报告右上角的 TREND
是无法显示数据的,--tep-reports
修复了这个问题,根据history数据生成TREND
走势图。
fixtures/fixture_admin.py
,在mapping
字典中# Add your env and variables
处添加环境变量,在# Add properties
处添加属性,参考domain
和mysql_engine
。示例:add()
方法动态添加环境变量:env_vars.add("my_var", 789)
env_vars
返回了类对象实例,通过.
运算符来使用环境变量:env_vars.domain
env_vars.mysql_engine
env_vars.my_var
不需要import,而是给test函数添加参数,如 def test(env_vars):
conf.yaml
文件中配置:env: qa
qa
环境。fixtures
目录中,除了预置的fixture_admin.py
,可以继续添加团队成员的fixture:fixture_your_name.py
需要到根目录的conftest.py
中注册才能生效:# Import fixtures
exec("from .fixtures.fixture_admin import *")
exec("from .fixtures.fixture_your_name import *")
conftest.py模块中建议全部定义成fixture,不对外提供function。
_yourname
后缀。fixtures\fixture_admin.py
中修改mysql_engine
:"mysql_engine": mysql_engine("127.0.0.1", # host
"2306", # port
"root", # username
"123456", # password
"test") # db_name
tests\mysql_test.py
预置了示例代码:from loguru import logger
def test_mysql(pd, env_vars):
logger.info(pd.read_sql("select 1 from dual", env_vars.mysql_engine))
data["列名"]["行号"]
的方式读取。tep.dao.print_db_table()
函数,如:from loguru import logger
from tep.dao import print_db_table
def test_mysql(pd, env_vars):
data = pd.read_sql("select 1 from dual", env_vars.mysql_engine)
logger.info(print_db_table(data))
# 造测试数据
faker = "^4.1.1"
# 提取JSON数据
jmespath = "^0.10.0"
# 屏蔽HTTPS警告
urllib3 = "^1.25.9"
# HTTP/HTTPS请求
requests = "^2.24.0"
# HTML测试报告
allure-pytest = "^2.8.16"
allure-python-commons = "^2.8.16"
# 打印日志
loguru = "^0.5.1"
# 访问数据库
pandas = "^1.1.0"
# 配置文件
pyyaml = "^5.3.1"
# 为pandas访问数据库提供engine
sqlalchemy = "^1.3.22"
# 把数据库表打印成表格
texttable = "^1.6.3"
# 支持sqlalchemy使用
pymysql = "^0.10.1"
联系客服