一、引言
Python在自动化测试领域非常强大。许多测试团队及开发人员使用Python来编写自动化测试套件和脚本。Python自动化测试框架可以提高测试的效率,帮助测试人员和开发人员更好地管理测试用例和结果。在本文中,我们将介绍一种快速搭建高效Python自动化框架的方法。
二、选择测试框架
选择适合自己团队的测试框架至关重要。Python的测试框架有很多,例如unittest、pytest、nose等等。在选择测试框架时,需要考虑到测试需求和团队成员的技能水平。
在本文中,我们选择 pytest 作为测试框架。pytest 是一个功能强大的 Python 测试框架,易于使用且灵活。pytest 是一个成熟的框架,提供灵活的 fixture 和 plugin 机制。
三、创建目录结构
要搭建 Python 自动化框架,需要创建一个适合的目录结构,如下:
.
|---README.md
|---requirements.txt
|---pytest.ini
|---tests
| |---__init__.py
| |---test_demo.py
|---utils
| |---__init__.py
| |---config.py
| |---logger.py
| ...
其中:
- requirements.txt:存储项目需要安装的依赖库; - pytest.ini:存储 pytest 的配置信息,例如输出格式、测试文件匹配规则等; - tests 目录:存储 pytest 测试用例文件; - utils 目录:存储项目中用到的工具类和函数。四、编写测试用例
我们创建一个测试用例文件 test_demo.py,包含两个用例:一个成功用例和一个失败用例。
import pytest
def test_success():
assert True
def test_fail():
assert False
五、配置 pytest
我们需要为 pytest 添加一些插件和 fixture,以便在运行测试用例时执行这些操作。在pytest.ini中,我们配置 pytest 的运行参数。
[pytest]
addopts = -vs --html=report.html --self-contained-html
testpaths = tests
log_cli = true
log_cli_level = INFO
log_file=logs/debug.log
log_file_level = INFO
junit_family = xunit2
在此示例中,我们添加了运行参数和日志记录功能。例如,我们添加了内容为 INFO 的日志等级。这样,我们就可以在日志文件中记录信息。Junit_family=xunit2指定了输出的测试结果格式,更容易生成报告。获取更多pytest参数可以查看pytest官网。
六、添加 Fixture
Fixture是pytest中非常有用的一个功能,它可以在测试函数执行开始之前并确保测试函数执行完成后清理资源。我们可以将 Fixture 定义在 conftest.py 中。
import pytest
@pytest.fixture(autouse=True, scope='session')
def setup():
# before all
yield
# after all
在上面的示例中,我们创建了一个全局 Fixture(autouse=True),它将在整个 pytest 会话期间自动运行。我们定义了在所有测试函数之前运行所有测试函数后清理资源的逻辑。
Fixture是一个非常有用的功能,我们可以在 Fixture 中执行诸如创建浏览器会话、创建数据库连接等操作。在创建 Fixture 时,最好遵循 Fixture 的单一职责原则。
七、添加命令行参数
我们可以使用命令行参数控制测试的范围和其他操作。在 pytest 中,我们可以使用命令行参数方便地完成这些操作。
import pytest
def pytest_addoption(parser):
parser.addoption(
'--runslow', action='store_true', default=False, help='run slow tests'
)
def pytest_collection_modifyitems(config, items):
if not config.getoption('--runslow'):
skip_slow = pytest.mark.skip(reason='need --runslow option to run')
for item in items:
if 'slow' in item.keywords:
item.add_marker(skip_slow)
我们在示例中添加了 --runslow 命令行参数,并定义了一个 pytest_collection_modifyitems hook。根据 --runslow 命令行参数自动跳过标记为 “slow”的测试用例。
八、添加日志记录
Python自动化框架需要进行日志记录。我们可以使用Python自带的logging模块来实现这个功能。
import os
import logging
from logging.handlers import RotatingFileHandler
def init_logger():
formatter = logging.Formatter('%(asctime)s - %(levelname)s - %(message)s')
logger = logging.getLogger()
logger.setLevel(logging.DEBUG)
log_file = os.path.join(os.path.abspath('.'), 'logs', 'debug.log')
file_handler = RotatingFileHandler(log_file, mode='a', maxBytes=50*1024*1024, backupCount=1)
file_handler.setFormatter(formatter)
file_handler.setLevel(logging.DEBUG)
console_handler = logging.StreamHandler()
console_handler.setFormatter(formatter)
console_handler.setLevel(logging.INFO)
logger.addHandler(file_handler)
logger.addHandler(console_handler)
init_logger()
在示例中,我们创建了一个名为 “debug.log” 的日志文件。它的最大大小为50兆字节,并在达到此大小时进行日志切割。日志的格式设置为 “%(asctime)s - %(levelname)s - %(message)s”。
九、添加配置文件
项目中经常需要定义一些配置,例如测试网站的URL等。我们可以创建一个 config.py 文件,存储这些配置。
class Config:
TEST_URL = 'https://www.example.com'
TIMEOUT = 30
我们在 Config 类中添加了一个 TEST_URL 属性。
十、优化并行测试
在 CI/CD 中,测试执行时间很重要。可以考虑使用 pytest-xdist 插件在多个 CPU 上并行运行测试,以提高测试的执行速度。
例如,在两个 CPU 上执行测试的示例:
pip install pytest-xdist
pytest -n 2
pytest-xdist 的使用非常简单,只需要安装 pytest-xdist 插件并添加 -n 参数即可。
十一、总结
在本教程中,我们介绍了如何创建一个快速搭建高效Python自动化框架。我们选择了 pytest 作为测试框架,并创建了适合的目录结构。我们还添加了 fixture、命令行参数、日志记录和配置文件。最后,我们优化了并行测试以提高测试的执行速度。