Python框架模型搭建

如何搭建框架,也就是如何创建包,模块,如何存放编写的代码

-- 怎么组织代码,怎么创建包,模块

-- 自动化测试用例放在哪里

-- 入口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/存放日志文件

Python框架模型搭建_第1张图片

具体存放的什么代码,如下:

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(测试用例)

Python框架模型搭建_第2张图片

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函数,日志文件会多产生信息

Python框架模型搭建_第3张图片

因为在执行第二个失败测试用例时,第一次写那支笔也存在,一共有两支笔,所以打印了两次

这个问题解决方法就是,导入logger.py下的调用函数的变量

Python框架模型搭建_第4张图片

 Python框架模型搭建_第5张图片

修改后日志信息是正常的

面试题:你的自动化测试框架是怎么搭建的?你的自动化测试框架包含了什么内容?

你们公司自动化测试怎么做的?

回答:

分层设计:不同的内容分开放到相应模块,好维护

每个包/模块分别处理什么问题:

-- run.py 收集所有测试用例

-- cases/存放所有的测试用例

-- report/目录存放所有测试报告

-- common/通用模块,存放excel,配置文件,日志等

解决了哪些接口自动化测试的问题:

-- 数据驱动

-- 数据库断言

-- 数据提取

-- 动态参数替换

你可能感兴趣的:(python,python)