Eu não pude resistir a confundir um pouco mais sobre encontrar uma maneira adequada de comparar a saída de um proces em execução (no terminal) contra um arquivo "golden run", como você mencionou.
Como capturar a saída do processo em execução
Eu usei o comando script
com a opção -f
. Isso grava o conteúdo do terminal atual (textual) em um arquivo; a opção -f
é atualizar o arquivo de saída em cada evento de gravação para o terminal. O comando de script é feito para manter registro de tudo o que acontece em uma janela de terminal.
O script abaixo importa essa saída periodicamente.
O que esse script faz
Se você executar o script em uma janela de terminal, ele abrirá uma segunda janela de terminal, iniciada com o comando script -f
. Nesta (segunda) janela de terminal, você deve executar o seu comando para iniciar o processo de benchmark. Embora esse processo de benchmark produza seus resultados, esses resultados são periodicamente (a cada 2 segundos) em comparação com a sua "corrida de ouro". Se uma diferença ocorreu, a saída diferente é exibida no terminal "principal" (primeiro) e o script é encerrado. Uma linha aparece no formato:
error: ('Solutions: 13.811084', 'Solutions: 13.811084 aap noot mies')
explanation:
error: (<golden_run_result>, <current_differing_output>)
Após essa saída, você pode fechar com segurança a segunda janela, executando seus testes.
Como usar
-
Copie o script abaixo em um arquivo vazio.
Quando você olha para o arquivo "golden run", a primeira seção (antes do início do teste real) é irrelevante e pode ser diferente em sistemas diferentes. Portanto, você precisa definir a linha onde a saída real começa. No seu caso eu configurei para:first_line = "**** REAL SIMULATION ****"
altere se necessário.
- Defina o caminho para o seu arquivo "golden run".
-
Salve o script como
compare.py
, execute-o pelo comando:python3 /path/to/compare.py
'
- uma segunda janela é aberta, dizendo
Script started, the file is named </path/to/file>
- nesta segunda janela, execute seu teste de benchmark, o primeiro resultado diferente aparece na primeira janela:
Comotestei
Eucrieiumpequenoprogramaqueimprimeaslinhasdeumaversãoeditadadesuacorridadeouro,umaporuma.Eufizoscriptcompará-loaoarquivo"golden run" original.
O script:
#!/usr/bin/env python3
import subprocess
import os
import time
home = os.environ["HOME"]
# files / first_line; edit if necessaary
golden_run = "/home/jacob/Bureaublad/log_example"
first_line = "**** REAL SIMULATION ****"
# don't change anything below
typescript_outputfile = home+"/"+"scriptlog.txt"
# commands
startup_command = "gnome-terminal -x script -f "+typescript_outputfile
clean_textcommand = "col -bp <"+typescript_outputfile+" | less -R"
# remove old outputfile
try:
os.remove(typescript_outputfile)
except Exception:
pass
# initiate typescript
subprocess.Popen(["/bin/bash", "-c", startup_command])
time.sleep(1)
# read golden run
with open(golden_run) as src:
original = src.read()
orig_section = original[original.find(first_line):]
# read last output of current results so far
def get_last():
read = subprocess.check_output(["/bin/bash", "-c", clean_textcommand]).decode("utf-8")
if not first_line+"\n" in read:
return "Waiting for first line"
else:
return read[read.find(first_line):]
with open(typescript_outputfile, "wt") as clear:
clear.write("\n")
# loop
while True:
current = get_last()
if current == "\n":
pass
else:
if not current in orig_section and current != "Waiting for first line":
orig = orig_section.split("\n")
breakpoint = current.split("\n")
diff = [(orig[i], breakpoint[i]) for i in range(len(breakpoint)) \
if not orig[i] == breakpoint[i]]
print("error: "+str(diff[0]))
break
else:
pass
time.sleep(5)