如何搭建框架,也就是如何创建包,模块,如何存放编写的代码
-- 怎么组织代码,怎么创建包,模块
-- 自动化测试用例放在哪里
-- 入口main,收集用例放在哪里
-- 测试数据,应该放在哪里
-- 测试报告放在哪里
-- 配置文件放在哪里
-- 日志文件放在哪里
-- excel操作
-- 托管提交到公司代码库(git,github,gitlab,gitee)
框架搭建步骤:
1.项目说白了就是一个目录,会放很多的文件,不是包,
所以先创建一个新的项目目录task_211012
2.建立一个收集用例的模块,run.py
3.report/目录存放所有测试报告,
使用unittestreport会自动生成report/目录,如果使用beautifulreport需要自己建立report/目录
4.data/存放所有的测试数据
5.common/存放所有的通用模块
common是通用的,其他的或多或少和项目有关系的
换名话也就是说,当你换一个项目时,common可以原封不动的复制到新项目中使用,但其他是需要修改总分内容的
6.cases/存放所有的测试用例
7.config/存放配置文件
8.log/存放日志文件
具体存放的什么代码,如下:
test_login.py(自动代测试用例,参数化)
import unittest
from login import login
from common.excel import read_excel
from ddt import ddt, data
from common.logger import log
# 调用read_excel函数,读取excel文件的数据
excel_path = r'E:\lemon\task_211012\data\cases.xlsx'
login_data = read_excel(excel_path, 'Sheet1')
@ddt
class TestLogin(unittest.TestCase):
@data(*login_data)
def test_login(self, row):
# row表示每次从data这个列表中取出一个数据,{}
# row代表一组测试数据,相当于for row in data:
# 源码:会自动生成一个新的test_login1函数
params = eval(row['data'])
username = params['username']
password = params['password']
expected = eval(row['expected'])
actual = login(username, password)
try:
self.assertEqual(expected, actual)
except AssertionError as e:
# 导入logger模块下的变量,不要导入函数
log.error('用例测试失败')
raise e
excel.py(读取测试用例cases.xlsx文件内容)
from openpyxl import load_workbook
def read_excel(file_name, sheet_name):
wb = load_workbook(file_name)
sheet = wb[sheet_name]
data = list(sheet.values)
titles = data[0]
rows = [dict(zip(titles, row)) for row in data[1:]]
return rows
logger.py(封装日志函数)
from loguru import logger
def get_logger(file):
logger.add(sink=file, encoding='utf-8')
return logger
log = get_logger(r'E:\lemon\task_211012\common\log\demo.log')
read_yaml.py(读取配置文件内容)
import yaml
def read_yaml(filename):
with open(filename, encoding='utf-8') as f:
data = yaml.safe_load(f)
return data
config.yaml(配置文件)
casename: 'test_database' server_address: 124.70.35.245 server_port: 8104 database_address: 124.70.35.245 database_port: 3306 database_name: 'EDC' username: 'admin' password: 123456
cases.xlsx(测试用例)
login.py(被测函数)
def login(username=None, password=None):
if username is None or password is None:
return {"code": "400", "msg": "用户名或密码为空"}
if username == 'yuz' and password == '123':
return {"code": "200", "msg": "登录成功"}
return {"code": "300", "msg": "用户名或密码错误"}
run.py(存放收集测试用例代码)
import unittest
import unittestreport
suite = unittest.defaultTestLoader.discover('cases')
runner = unittestreport.TestRunner(suite)
runner.run()
运行run.py后会自动生成report/目录,demo.log内会存入日志信息
2021-10-15 10:25:01.946 | ERROR | test_login:test_login:27 - 用例测试失败 2021-10-15 10:25:01.948 | ERROR | test_login:test_login:27 - 用例测试失败
注意:
在test_login.py下如果调用logger.py下的get_logger函数,日志文件会多产生信息
因为在执行第二个失败测试用例时,第一次写那支笔也存在,一共有两支笔,所以打印了两次
这个问题解决方法就是,导入logger.py下的调用函数的变量
修改后日志信息是正常的
面试题:你的自动化测试框架是怎么搭建的?你的自动化测试框架包含了什么内容?
你们公司自动化测试怎么做的?
回答:
分层设计:不同的内容分开放到相应模块,好维护
每个包/模块分别处理什么问题:
-- run.py 收集所有测试用例
-- cases/存放所有的测试用例
-- report/目录存放所有测试报告
-- common/通用模块,存放excel,配置文件,日志等
解决了哪些接口自动化测试的问题:
-- 数据驱动
-- 数据库断言
-- 数据提取
-- 动态参数替换