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)