基于pytest二次封装调整的测试框架,封装了一些钩子以及常用工具,可以满足简单的测试需求,如果需要大型的测试,需要额外封装功能
安装requirements.txt, 由于接口测试通用性实在不怎么样,各个公司甚至各个需求所对应的认证请求逻辑都不一样,因此这里就不封装了,封装了一个UI和数据库的,接口的自行进行封装
配置都使用config模块中的配置,根据启动pytest时指定环境进行切换配置
如果env 不存在,则使用configs.json中的默认配置
pytest ./ --env dev # 使用config-dev.json中的配置
pytest ./ --env prod # 使用configs-prod.json中的配置
所有跟用例相关的配置可以通过configs获取
from config.globalVars import configs
configs.get_config('api', 'host')
通过这样实现一个动态配置
覆盖json文件中的配置通过--config 设置
pytest ./ --env dev --config api.host=www.baidu.com
--config 设置的配置会覆盖掉当前配置,如上述会先切换到dev环境的配置,在进行覆盖
pytest.ini中设置了mark严格,使用@pytest.mark.TestCase
外的自定义标签会报错
(venv) root@root-263 ~/PycharmProjects/AutoMationTest master ±✚ pytest -s testcase/test_demos.py::test_read_yml
运行环境为: 测试
收到外部配置为: []
================================================================================================= test session starts ==================================================================================================
platform darwin -- Python 3.9.1, pytest-6.2.3, py-1.10.0, pluggy-0.13.1
rootdir: /Users/wangbaofeng/PycharmProjects/AutoMationTest, configfile: pytest.ini
collected 1 item
testcase/test_demos.py [INFO] [2021-06-26 16:54:40,092] [test_demos.py:18] : {'登录': 'xpath=/html/body/div[1]/div[1]/div[4]/a', '用户名登录': 'xpath=/html/body/div[4]/div[2]/div[2]/div/div/div/div/div/div[3]/p[2]', xpath=/html/body/div[4]/div[2]/div[2]/div/div/div/div/div/div[1]/form/p[5]/input[2]', '密码': 'xpath=/html/body/div[4]/div[2]/div[2]/div/div/div/div/div/div[1]/form/p[6]/input[2]', '确认登录': 'xpath=/html/body/div[42]/div[2]/div/div/div/div/div/div[1]/form/p[9]/input'}
.测试详情
通过用例:
test_read_yml
================================================================================================== 1 passed in 0.01s ===================================================================================================
(venv) ✘ root@rootdeMacBookPro-263 ~/PycharmProjects/AutoMationTest master ±✚ pytest -s testcase/test_demos.py::test_read_yml --env prod --config api.host=www.baidu.com
运行环境为: prod
收到外部配置为: ['api.host=www.baidu.com']
================================================================================================= test session starts ==================================================================================================
platform darwin -- Python 3.9.1, pytest-6.2.3, py-1.10.0, pluggy-0.13.1
rootdir: /Users/wangbaofeng/PycharmProjects/AutoMationTest, configfile: pytest.ini
collected 1 item
testcase/test_demos.py [INFO] [2021-06-26 16:58:51,020] [test_demos.py:18] : {'登录': 'xpath=/html/body/div[1]/div[1]/div[4]/a', '用户名登录': 'xpath=/html/body/div[4]/div[2]/div[2]/div/div/div/div/div/div[3]/p[2]', xpath=/html/body/div[4]/div[2]/div[2]/div/div/div/div/div/div[1]/form/p[5]/input[2]', '密码': 'xpath=/html/body/div[4]/div[2]/div[2]/div/div/div/div/div/div[1]/form/p[6]/input[2]', '确认登录': 'xpath=/html/body/div[42]/div[2]/div/div/div/div/div/div[1]/form/p[9]/input'}
.测试详情
通过用例:
test_read_yml
================================================================================================== 1 passed in 0.01s ===================================================================================================
(venv) wangbaofeng@wangbaofengdeMacBookPro-263 ~/PycharmProjects/AutoMationTest master ±✚
如果环境不是test, 会在运行结束后根目录下生成result.json,内容如下
{"cases": [{"start_time": 1624698133000, "end_time": 1624698133000, "level": "1", "result": "Success", "case_name": "", "function_name": "test_read_yml", "case_module": "", "duration": 0}], "duration": 0, "startTime": 1624698133000, "endTime": 1624698133000, "result": "Success", "passRent": 1.0}
Cases 字段对应为数组类型,包含了本地运行任务中所有用例运行信息
startTIme和endTime 对应为任务运行时间以及结束时间
duration为任务耗时
result为测试结果,本次运行所有用例都通过为Success, 包含失败则为Failed
passRent为通过率
cases字段对应数组中,每一个Map为一个测试用例,分别包含了
Start_time/end_time 开始/结束时间
Level 用例等级,通过在@pytest.mark.TestCase
注解中参数进行获取
result 对应该用例运行结果,setup,call, teardown均通过为Success,setup/teardown报错为Error, call报错为Failed(skip/xfail均为Faild)
Case_name 用例名称 同Level
Function_name 测试用例函数名,
Case_module 用例所属模块,同Level
由于经历有限,只提供几个功能,在lib目录下
对python的SQLAlchemy进行的一个封装,包含了Mysql, Oracle客户端,以及Redis连接
但是本人未测试,可能有些报错,需要自行debug调试
抽象基类
class Client(ABC):
@abstractmethod
def select(self, *args, **kwargs):
pass
@abstractmethod
def insert(self, *args, **kwargs):
pass
@abstractmethod
def update(self, *args, **kwargs):
pass
@abstractmethod
def delete(self, *args, **kwargs):
pass
导入方式
from lib.db import MysqlClient, OracleClient, RedisClient
参数说明:
Mysql
def __init__(self,
host: AnyStr,
username: AnyStr,
password: AnyStr,
port: Optional[int] = 3306,
database: Optional[AnyStr] = None,
**kwargs,
):
pass
Oracle
def __init__(self,
host: AnyStr,
port: int,
database: AnyStr,
username: AnyStr,
password: AnyStr,
mode: Optional[AnyStr] = None,
**kwargs):
pass
Redis
def __init__(self,
host: AnyStr,
port: Optional[int] = 6379,
username: Optional[AnyStr] = 'root',
password: Optional[AnyStr] = '',
db_index: Optional[int] = 0,
Pool: bool = False):
pass
提供了一个读取文件的类
使用方式
from lib.files import ReadFileData
data = ReadFileData("path/to/your/file")
data = data.data # 数据在data属性上
excel_data = ReadFileData("path/to/your/file",line=[1,3]) # 读取1,2行excel数据,与python切片对应
csv_data = ReadFileData("path/to/your/file",line=5) # 读取第五行数据
json_data = ReadFileData("path/to/your/file",key='wang') # 只读取key对应value
支持格式
支持json, yaml, xlsx, csv, 同时csv 以及 xlsx可以指定line读取,yaml,json可以指定key读取
只提供一个Ping
from lib.http import Ping
result :bool = Ping("https://www.baidu.com")
result为True或者False
基本上是对loging, os, shutil的二次封装,不再赘述
提供一个获取驱动的类
from lib.ui import Driver
driver = Driver(browser="Chrome", headless=True)
request.cls.driver = driver.driver
只需要指定 浏览器,支持Mac OS/Linux下 firefox, Chrome, windows下 IE/firefox/chrome
感谢jetbrains提供的大力支持jetbrains