编写Python脚本以自动化llvm代码覆盖率测试



这是我用Python编写代码的第一天,我在一些自动化方面遇到了困难。我有一个程序(./main),它通过输入重定向("./main<1.txt")接收.txt文件。我需要用1000个不同的txt文件(1.txt到1000.txt)运行它,并使用llvm将合并的代码覆盖率数据输出到文件覆盖率.txt。在bash中,以下命令对两个文件都是成功的:

clang++ -fprofile-instr-generate -fcoverage-mapping main.cpp -o main
-LLVM_PROFILE_FILE="1.profraw" ./main < 1.txt
-LLVM_PROFILE_FILE="2.profraw" ./main < 2.txt
llvm-profdata merge -sparse 1.profraw 2.profraw -o main.profdata
llvm-cov show ./main -instr-profile=main.profdata main.cpp > coverage.txt

我的目标是用Python编写脚本,并循环创建和合并所有.profraw文件。我尝试了以下方法的许多变体,但都没有成功:

subprocess.call(["clang++", "-fprofile-instr-generate", "-fcoverage-mapping", "main.cpp", "-o", "main"])
i = 1
while i <= 1000:
inputFilename = str(i) + ".txt"
outputFilename = """ + str(i) + ".profraw""
llvmCommand = "LLVM_PROFILE_FILE="   
cmd = [llvmCommand, outputFilename, "./main", "<", inputFilename]
p = subprocess.Popen(cmd, shell=True)
p.communicate()
i += 1

我还没有进入合并步骤,因为这不会生成任何.profraw文件。它也不会在Spyder中或从终端运行时生成任何错误消息。

提前感谢您的帮助;我知道这是基本的,但我花了几个小时在上面,运气不好。

编辑:尝试Henk的方法:

i = 1
while i <= 1000:
inputFilename = ''.join([str(i), ".txt"])
outputFilename = ''.join(['"', str(i), '.profraw"'])
llvmCommand = ''.join(["LLVM_PROFILE_FILE=", outputFilename])  
cmd = [llvmCommand, "./main", "<", inputFilename]
sp = subprocess.Popen(cmd, stdout=subprocess.PIPE, stderr=subprocess.PIPE)
out, err = sp.communicate()
i += 1

这是我收到的错误(即使我硬编码绝对文件路径):

FileNotFoundError: [Errno 2] No such file or directory:
'LLVM_PROFILE_FILE="1.profraw"': 'LLVM_PROFILE_FILE="1.profraw"'

如果使用这种方法,您可以看到stdout和stderr中出现了什么问题(如果有的话)。

sp = subprocess.Popen([executable, arg1, arg2], stdout=subprocess.PIPE, stderr=subprocess.PIPE)
out, err = sp.communicate()

最新更新