Написание скрипта Python для автоматизации тестирования покрытия кода llvm - PullRequest
0 голосов
/ 04 февраля 2019

Это мой первый день написания кода на Python, и у меня трудные времена с некоторой автоматизацией.У меня есть программа (./main), которая принимает файлы .txt через перенаправление ввода ("./main <1.txt").Мне нужно запустить его с 1000 различными TXT-файлами (от 1.txt до 1000.txt) и использовать llvm для вывода объединенных данных покрытия кода в файл cover.txt.В bash следующие команды успешны для двух файлов: </p>

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 или при запуске из терминала.

Заранее спасибо за любую помощь;Я знаю, что это просто, но я потратил на это часы без удачи.

Редактировать: Попытка подхода Хенка:

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 голосов
/ 04 февраля 2019

Если вы используете этот подход, вы можете увидеть, что (если что-то) пошло не так в stdout и stderr.

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