day18_项目框架搭建1

项目的工程目录:

在这里插入图片描述

  • py_53 --根目录
    • py_api --子目录
      • day18_项目框架搭建 --项目工程目录
        • common —公用模块
          • excle.py -获取Excel表单的数据
          • handler_log.py -日志的封装
        • config --配置模块
          • setting.py -相关文件的配置
          • init.py
        • conf_ini --配置模块
          • d1_ini.ini
          • d2_ini文件读取.py
        • data --用例读取模块
          • case.xlsx
        • logs --日志模块
          • py53.log
        • reports --case报告模块
          • report.html
        • tests --用例模块
          • test_register.py
          • test_login.py
        • unitcase
          • test_excel.py
            main.py --主程序入口
            总结.md
            init.py
day_18项目框架搭建
	- api
		* helper.py
		* __init__.py
	- common
		* headler_excel.py
		* headler_log.py
	- conf_ini
		* d1_ini.ini
		* d2_ini文件读取.py
	- data 
		* case.xlsx
	- logs --日志模块
		* py53.log
	- reports --case报告模块
		* report.html
	- tests --用例模块
		* test_register.py
		* test_login.py
	- unitcase
		* test_excel.py
	main.py --主程序入口
	总结.md
	__init__.py

# helper.py
def login(username, passwd):
    """业务"""
    # 到底怎么才能去访问接口
    """登录功能。 开发写的接口"""
    response = {"message": None,
                "code": None,
                "token": None}

    if username == 'kino' and passwd == '123456':
        response['message'] = 'success'
        response['code'] = 200
        response['token'] = "good token"
        return response
    if username == '':
        response['message'] = '用户名为空'
        response['code'] = 400
        return response
    if passwd == '':
        response['message'] = '密码为空'
        response['code'] = 400
        return response
    else:
        response['message'] = '用户名或密码错误'
        response['code'] = 400
        return response
# hander_excel.py
import openpyxl
from openpyxl.worksheet.worksheet import Worksheet


def read_excel_dict(file, sheet_name="Sheet1"):
    """读取excel"""
    # 打开文件
    workbook = openpyxl.load_workbook(file)
    # 选择表单,表格 Sheet1
    sheet: Worksheet = workbook[sheet_name]

    data = list(sheet.values)
    title = data[0]
    rows = data[1:]

    data = [dict(zip(title, row)) for row in rows]
    return data


if __name__ == '__main__':
    # 1,当你想测试这个模块功能的时候,单独来点击播放件,执行下面的测试代码。
    # 2,当其他模块调用这个模块时候,下面的测试代码就不会执行了。
    # 模块当中就是只有各种定位,函数,类
    fspath = r'/Users/zhangping/Documents/py_53/py_api/day18_项目框架搭建/data/cases.xlsx'
    data = read_excel_dict(fspath)
    print(data)
# handler_log.py
from loguru import logger
from py_api.day18_项目框架搭建.config.setting import Config


logger.add(Config.LOG_FILE, encoding='utf-8')
# d1_ini.ini
[default]
host=http://www.yuz.com
hobby=[1,2,3]

[db]
host=http://www.yuzwang.com
port=3306
name="py"
connected=true
# d2_ini文件读取.py
from configparser import ConfigParser

parser = ConfigParser()
parser.read('d1_ini.ini', encoding='utf-8')

# 读取配置项
host = parser.get('default', 'host')
print(host)

port = parser.get('db', 'port')
print(port)
print(type(port))

hobby = parser.get('default', 'hobby')
print(hobby)
print(type(hobby))
# setting.py
class Config:
    # 域名
    HOST = 'http://example.com'
    # 端口
    PORT = 8080

    # 测试用例文件名
    CASE_FILE = r'/Users/zhangping/Documents/py_53/py_api/day18_项目框架搭建/data/cases.xlsx'

    # log 存储的文件
    LOG_FILE = r'/Users/zhangping/Documents/py_53/py_api/day18_项目框架搭建/logs/py53.log'
# case.xlsx
# py53.log
2022-09-05 17:45:46.586 | INFO     | test_login_8:test_login:28 - 正在测试...
2022-09-05 17:45:46.587 | ERROR    | test_login_8:test_login:39 - {'message': 'success', 'code': 200, 'token': 'good token'} != None
2022-09-05 17:45:46.588 | INFO     | test_login_8:test_login:28 - 正在测试...
# report.html
# test_login.py
import unittest
from py_api.day18_项目框架搭建.api.helper import login
from py_api.day18_项目框架搭建.common.excel import read_excel_dict
from unittestreport import ddt, list_data
from py_api.day18_项目框架搭建.common.log_handler import logger
from py_api.day18_项目框架搭建.config.setting import Config

# 从配置文件倒入用例文件
data_file = Config.CASE_FILE
cases = read_excel_dict(data_file, "Sheet1")


@ddt
class TestLogin(unittest.TestCase):

    @list_data(cases)
    def test_login(self, case):
        # 获取参数
        data_str = case['data']
        logger.info("正在测试...")
        # 字符串要转成字典
        data = eval(data_str)
        # 把单元(被函数) 改成被测接口, 接口访问过程
        actual = login(data['username'], data['passwd'])

        expected = case['expected']
        expected = eval(expected)
        try:
            self.assertEqual(expected, actual)
        except AssertionError as e:
            logger.error(e)
            raise e
 # test_excel
 from py_api.day18_项目框架搭建.common.excel import read_excel_dict


def test_excel():
    fspath = r'/Users/zhangping/Documents/py_53/py_api/day18_项目框架搭建/data/cases.xlsx'
    data = read_excel_dict(fspath)
    print(data)
# main
# 主程序


import unittest
import unittestreport

# 填入开始目录, 符合规则的用例会被自动收集
suit = unittest.defaultTestLoader.discover('tests')
print(suit)

# 运行
# result = unittest.TextTestRunner().run(suit)
# print(result)

# 定制化的运行器和测试报告。
runner = unittestreport.TestRunner(suit,
                                   title='项目测试报告',
                                   tester='Memory.荒年〆',
                                   desc="企业专用项目",
                                   templates=2
                                   )
runner.run()


  • case.xlsx
    在这里插入图片描述
  • report.html
    在这里插入图片描述

总结

项目框架搭建(面试题)

目标:执行接口自动化测试

  • 必须要支持可以编写自动化用例(测试函数) DONE
  • 用例数据,Excel, yaml, py DONE
  • 大多数的自动化测试用例都是手工测试转成的。
  • 支持读取Excel操作 DONE
  • 收集用例,运行,生成报告 DONE
  • 支持日志处理 logging DONE
  • 支持配置文件处理 py DONE
  • 支持邮件发送(框架实现, Jenkins)
  • 支持数据驱动 DONE
  • 支持接口访问 doing…

怎么实现的:

  • 分层设计, 介绍各种包,各个模块的用途

对自己写的代码简单的自测

  • main 函数

分层设计

好处:方便维护和管理

  • cases 用例
  • 通用程序, common
  • 辅助函数,通常和项目,业务有关, api
  • 测试数据独立管理
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值