如何通过控制台菜单调用exec()执行指定pytest测试方法?
如何通过Python调用pytest执行指定测试方法
首先直接回应你的核心疑问:exec('pytest -s login.test_2') 是不可行的。因为exec()函数的作用是执行Python代码字符串,而pytest -s login.test_2是一条Shell命令,exec会尝试把它当作Python代码解析,必然会抛出语法错误。
下面给你两种可靠的实现方式,推荐第一种:
方法一:使用subprocess模块(推荐)
这是Python官方推荐的执行外部命令的方式,安全、可控,还能捕获命令输出、返回状态码等信息。
修改你的控制台菜单代码如下:
import subprocess n = int(input("请选择测试项:")) if n == 1: # 执行test_1.py的所有测试 subprocess.run(['pytest', '-s', 'test_1.py'], check=True) elif n == 2: # 执行login.py中的test_2方法 subprocess.run(['pytest', '-s', 'login.test_2'], check=True)
check=True:如果pytest执行失败(比如测试用例不通过),会抛出subprocess.CalledProcessError异常,方便你处理错误场景;如果不需要捕获异常,可以去掉这个参数。- 用列表形式传递命令参数,避免了Shell注入风险,比直接用字符串+
shell=True更安全。
方法二:使用os.system(简易但不推荐)
如果你只是想要一个快速能用的简易方案,也可以用os.system,它会直接调用Shell执行命令:
import os n = int(input("请选择测试项:")) if n == 1: os.system('pytest -s test_1.py') elif n == 2: os.system('pytest -s login.test_2')
但这种方式的缺点是:无法直接获取命令的返回码、输出内容,而且存在Shell注入的安全风险(如果你的菜单接收用户输入的话),所以更推荐用subprocess。
额外注意:你的login.py代码小问题
看你贴的login.py代码,有个小笔误会导致pytest识别不到测试方法,记得修正:
# 原代码里的@Scenario是大写,但你定义的变量是小写scenario,且pass不需要加括号 from functools import partial import pytest_bdd scenario = partial(pytest_bdd.scenario, '..\login.feature') @scenario('login 2') def test_2(): pass
内容的提问来源于stack exchange,提问作者Bambooprog
相关产品推荐
相关产品推荐

