1、錯誤代碼:
def generate_allure_report(self):
common = ["allure", "generate", "./reports/allure/temps", "-o", "./reports/allure/report", "--clean"]
# common = ['allure', '--version']
try:
# 使用subprocess.run來執行命令
result = subprocess.run(
common,
shell=True, # mac端使用時需要註釋掉,否則報錯
check=True,
stdout=subprocess.PIPE,
stderr=subprocess.PIPE,
text=True
)
logutil.info("Allure report generated successfully.")
logutil.info("Output:", result.stdout)
2、代碼背景
上述代碼是在pytest執行完成後執行allure命令生成測試報告,本身可以通過os.system執行,但是為了符合目前新的規範,個人選擇改用了subprocess.run()的方式去寫入命令。
本來在window端執行沒有任何問題,但是在mac端執行時,則直接報錯:
returned non-zero exit status 127
3、報錯原因
首先,我在命令行手動執行allure命令是沒問題的,所以確定allure安裝配置正確。剛開始以為是版本問題,後來切換了其他版本發現也是一樣報錯,於是百度了一下,發現居然沒有人發同樣的問題上來,最終,ai了一下,發現了正確原因:
【
在 macOS 上,subprocess.run 的 shell=True 參數可能導致命令解析問題,尤其是當 allure 命令依賴於環境變量時。
】
但是原因也不具體,這裏解決問題,不探究底層了。
4、解決方式
把shell=True這行註釋掉後,就可以正常調用執行了。
所以最終正確代碼如下:
def generate_allure_report(self):
common = ["allure", "generate", "./reports/allure/temps", "-o", "./reports/allure/report", "--clean"]
# common = ['allure', '--version']
try:
# 使用subprocess.run來執行命令
result = subprocess.run(
common,
# shell=True, # mac端使用時需要註釋掉,否則報錯
check=True,
stdout=subprocess.PIPE,
stderr=subprocess.PIPE,
text=True
)
logutil.info("Allure report generated successfully.")
logutil.info("Output:", result.stdout)