总结
QQ邮箱自动发送测试allure用例报告
先创建必要文件,这些文件,会在后面依次创建
F:测试day77day77
bauto_increat,所有操作都在 py_tests 目录内完成
├─scripts
│ ├─test_case.py
│ └─__init__.py
├─conf #主逻辑文件
│ ├─test_case.py
│ └─__init__.py
├─data #存放数据文件
│ └─__init__.py
├─logs
├─report #存放用例集的文件
│ ├─report.html # pytest-html生成的用例报告
│ ├─assets # allure的依赖目录
│ ├─result # allure生成的用例数据
│ └─allure_html # allure生成的用例报告目录
| └─index.html # allure生成的最终的html类型的测试报告
├─case_set.py #用例脚本文件
├─run.py # 用例启动文件
├─pytest.ini # 配置文件
└─__init__.py
先在scripts中创建test_case.py,在脚本中写入简单用例,测试run.py文件是否运行成功
run.py
if __name__ == "__main__":
import pytest
pytest.main()
test_case.py
def test_case():
assert 0
如果通过之后,在测试test_case.py文件中写入遍历数据的代码测试
import pytest
li = [1,2,3,4,5]
@pytest.mark.parametrize("data",li)
def test_case(data):
print(data)
assert 1
是否将数据成功打印,并且用例通过,然后通过建立data文件夹,将操作的excel表格放入文件夹下,在conf文件夹中建立setting.py配置文件,然后测试是否能够获取到excel中的数据
setting.py
import os
--------------根目录-------------------
base_dir = os.path.dirname(os.path.dirname(os.path.abspath(file)))
os.path.abspath(file) 是获取当前文件的绝对路径
os.path.dirname() 跳到参数文件的父级路径
--------------文件相关操作--------------
file_name = '接口测试示例.xlsx'
file_path = os.path.join(base_dir,"data",file_name)
if name == 'main':
print(base_dir)
print(file_path)
然后建立utils文件夹,在文件夹中创建操作excel表格的py脚本
ExcelHardler.py
""" 关于Excel表格操作 """ import xlrd from conf import settings
class Excel(object):
def get_excel_data(self): book = xlrd.open_workbook(filename=settings.file_path) sheet = book.sheet_by_index(0) print(sheet.nrows)
if name == 'main':
excel_obj = Excel()
excel_obj.get_excel_data()
然后测试类方法是否可以操作excel,然后在ExcelHardler.py中获取到数据,设计数据类型为列表套字典,列表数据以返回值的方式返回给函数
""" 关于Excel表格操作 """ import xlrd from conf import settings
class Excel(object):
def get_excel_data(self): book = xlrd.open_workbook(filename=settings.file_path) sheet = book.sheet_by_index(0) title = sheet.row_values(0) #获取excel表格中表头 li = list() #得到excel数据后,设计数据结构为列表套字典 for row in range(1,sheet.nrows): li.append(dict(zip(title,sheet.row_values(row)))) # print(li) 生成数据之后将数据作为返回值返回给函数,以便导包后使用方便 return li
if name == 'main':
excel_obj = Excel()
excel_obj.get_excel_data()
然后在test_case.py中导入ExcelHardler.py的类方法获取数据,并且遍历测试
test_case.py
import pytest from utils.ExcelHandler import Excel
@pytest.mark.parametrize("data",Excel().get_excel_data())
def test_case(data):
print(data)
assert 1
创建logs日志,方便打印查找错误,在utils文件中创建LogHardler.py
LogHardler.py
import logging from conf import settings
class LoggerHandler:
""" 日志操作 """
_logger_level = {
'debug': logging.DEBUG,
'info': logging.INFO,
'warning': logging.WARNING,
'error': logging.ERROR,
'critical': logging.CRITICAL
}def __init__(self, log_name, file_name, logger_level, stream_level='info', file_level='warning'): self.log_name = log_name self.file_name = file_name self.logger_level = self._logger_level.get(logger_level, 'debug') self.stream_level = self._logger_level.get(stream_level, 'info') self.file_level = self._logger_level.get(file_level, 'warning') # 创建日志对象 self.logger = logging.getLogger(self.log_name) # 设置日志级别 self.logger.setLevel(self.logger_level) if not self.logger.handlers: # 设置日志输出流 f_stream = logging.StreamHandler() f_file = logging.FileHandler(self.file_name) # 设置输出流级别 f_stream.setLevel(self.stream_level) f_file.setLevel(self.file_level) # 设置日志输出格式 formatter = logging.Formatter( "%(asctime)s %(name)s %(levelname)s %(message)s" ) f_stream.setFormatter(formatter) f_file.setFormatter(formatter) self.logger.addHandler(f_stream) self.logger.addHandler(f_file) @property def get_logger(self): return self.logger
def logger(log_name='接口测试'):
return LoggerHandler(
log_name=log_name,
logger_level=settings.LOG_LEVEL,
file_name=settings.LOG_FILE_NAME,
stream_level=settings.LOG_STREAM_LEVEL,
file_level=settings.LOG_FILE_LEVEL
).get_logger
if name == 'main':
logger().debug('aaaa')
logger().info('aaaa')
logger().warning('aaaa')
然后在setting文件中配置日志参数
setting.py
import os import datetime
--------------根目录-------------------
base_dir = os.path.dirname(os.path.dirname(os.path.abspath(file)))
--------------文件相关操作--------------
file_name = '接口测试示例.xlsx'
file_path = os.path.join(base_dir,"data",file_name)---------------- 日志相关 --------------------
日志级别
LOG_LEVEL = 'debug'
LOG_STREAM_LEVEL = 'debug' # 屏幕输出流
LOG_FILE_LEVEL = 'info' # 文件输出流日志文件命名
LOG_FILE_NAME = os.path.join(base_dir, 'logs', datetime.datetime.now().strftime('%Y-%m-%d') + '.log')
if name == 'main':
print(base_dir)
print(file_path)