python是一门解释型编程语言,代码不需要编译,修改后立刻可以执行。

而配置文件中的数据都会转化为python中的对象来进行操作,所以我们可以单独使用一个python文件,在其中定义配置信息。

框架中的其他核心模块,直接导入该配置模块中的配置变量直接使用,效率更高,更直观。

很多python项目都是采用这种方式进行配置化,例如django.

一 、创建配置模块

在项目根目录创建模块settings.py,在其中直接定义配置项。

#!/usr/bin/env python
# -*- coding: utf-8 -*-
# @Time    : 2021/11/17 20:27
# @Author  : shisuiyi
# @File    : setting.py
# @Software: win10 Tensorflow1.13.1 python3.9


# 日志配置
LOG_CONFIG = {
    'name': 'py45',
    'filename': 'D:\Lemon\py45\day20\logs\my.log',
    'debug': 'true'
}

# 测试用例目录
TESTCASES_DIR = 'D:\Lemon\py45\day20\testcases'


# 测试数据
TEST_DATA_FILE ='D:\Lemon\py45\day18\testdata\testdata.xlsx'

# 测试报告
REPORT_CONFIG = {
    'report_dir': 'D:\Lemon\py45\day18\reports',
    'title': 'py45期第一份测试报告',
    'desc': '木森老师的测试报告模板',
    'tester': 'shisuiyi',
    'templates': 3
}

二、项目路径处理

前面我们实现了配置化,但其中路径都是使用的项目根目录的相对路径,在调试子模块时会出现路径错误的问题。

为了解决上面的问题,我们需要在项目中使用动态创建的绝对路径。

1. 全局变量__file__

python中的每个模块中有一个特殊的变量__file__它的值永远是当前模块的绝对路径。

创建模块demo.py,在其中输入如下内容:

print(__file__)

运行后会输出当前模块的绝对路径

D:/project/classes/py38/day22/demo.py

即使在别的模块中导入这个模块时,这个值依然是这个模块的绝对路径。

所以可以利用这个属性来动态的获取项目的根目录,再通过路径拼接来获取其他需要配置路径的绝对路径。

2. os模块

路径处理涉及到不同系统的格式问题,直接使用字符串拼接太麻烦,可以使用内置模块os来进行路径的处理。

2.1 获取当前模块的路径

import os
print(os.path.abspath(__file__))
print(__file__)
D:\project\classes\py38\day22\demo.py
D:/project/classes/py38/day22/demo.py

上面的代码是在windows系统上运行的,可以看到os.path.abspath会根据系统处理路径,在windows下路径使用反斜杠表示目录

2.2 获取当前模块所在的目录

import os
print(os.path.dirname(os.path.abspath(__file__)))
D:\project\classes\py38\day22

os.path.dirname可以获取一个路径的父路径(上一层路径)

2.3 拼接路径

import os
BASE_DIR = os.path.dirname(os.path.abspath(__file__))

print(os.path.join(BASE_DIR, 'logs'))
D:\project\classes\py38\day22\logs

os.path.join可以将多个路径按照系统风格拼接起来

3. 在settings配置文件中处理路径

根据上面的知识,我们可以在配置文件中动态的生成绝对路径。

修改settings.py文件如下:

#!/usr/bin/env python
# -*- coding: utf-8 -*-
# @Time    : 2021/11/17 20:27
# @Author  : shisuiyi
# @File    : setting.py
# @Software: win10 Tensorflow1.13.1 python3.9
import os

# 项目根目录
BASE_DIR = os.path.dirname(os.path.abspath(__file__))
print(BASE_DIR)

# 日志配置
LOG_CONFIG = {
    'name': 'py45',
    'filename': os.path.join(BASE_DIR, 'logs', 'my.log'),
    'debug': 'true'
}

# 测试用例目录
TESTCASES_DIR = os.path.join(BASE_DIR, 'testcases')


# 测试数据
TEST_DATA_FILE = os.path.join(BASE_DIR, 'testdata', 'testdata.xlsx')

# 测试报告
REPORT_CONFIG = {
    'report_dir': os.path.join(BASE_DIR, 'reports'),
    'title': 'py45期第一份测试报告',
    'desc': '木森老师的测试报告模板',
    'tester': 'shisuiyi',
    'templates': 3
}
print(__file__)

common 文件夹下的 __init__.py的文件中调用解析配置文件的函数

#!/usr/bin/env python
# -*- coding: utf-8 -*-
# @Time    : 2021/11/13 10:16
# @Author  : shisuiyi
# @File    : __init__.py.py
# @Software: win10 Tensorflow1.13.1 python3.9
from common.log_handler import get_logger
from common.read_excel_tool import get_data_from_excel
import setting


logger = get_logger(**setting.LOG_CONFIG)  # 在这里创建日志器
#!/usr/bin/env python
# -*- coding: utf-8 -*-
# @Time    : 2021/11/8 21:08
# @Author  : shisuiyi
# @File    : test_login.py
# @Software: win10 Tensorflow1.13.1 python3.9
import unittest

import setting
from testcode import login
from unittestreport import ddt, list_data
# from common.read_excel_tool import get_data_from_excel
from common import get_data_from_excel  # 事先在common 中的__init__导入了get_data_from_excel

from common import logger

cases = get_data_from_excel(setting.TEST_DATA_FILE, 'login')

# 略	~

main.py

#!/usr/bin/env python
# -*- coding: utf-8 -*-
# @Time    : 2021/11/9 20:14
# @Author  : shisuiyi
# @File    : main.py
# @Software: win10 Tensorflow1.13.1 python3.9
import unittest
import unittestreport
import setting


if __name__ == '__main__':
    discover = unittest.defaultTestLoader.discover(setting.TESTCASES_DIR)  # 表示收集当前目录下所有用例
    runner = unittestreport.TestRunner(discover, **setting.REPORT_CONFIG)
    runner.run()

测试报告如下