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

时间:2019-02-04 19:58:57

标签: python bash llvm code-coverage

这是我用Python编写代码的第一天,我在自动化方面有些艰难。我有一个程序(./main)通过输入重定向(“ ./main <1.txt”)接收.txt文件。我需要使用1000个不同的txt文件(从1.txt到1000.txt)运行它,并使用llvm将合并的代码覆盖率数据输出到文件coverage.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"'

1 个答案:

答案 0 :(得分:2)

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

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