Usando Pytest para testar um Programa Python

0

Pergunta

De TI sou muito novo para Programação Python e tem uma pergunta no teste, utilizando Pytest. Em um alto nível, eu tenho um programa que leva de 3 pedaços de entrada do usuário e gera um arquivo de texto no final. Para meus testes, eu quero, basicamente, compare os arquivos de meu programa de saída, com o que deve ser.

Agora, eu não estou certo como ir sobre os testes. O próprio programa não requer argumentos, mas só depende de 3 pedaços de entrada do usuário, o que eu vou usar monkeypatch para simular. Posso criar um novo arquivo chamado python program_test.py e ter métodos aqui que chamar o programa original? Eu tentei isso, mas eu estou tendo problemas quando, na verdade, chamar o programa original e o envio na simulação de entradas. Ou, tenho testes no programa original (o que não faz muito sentido para mim).

Eu quero algo como isto:

import my_program

def test_1():
    inputs = iter(['input1', 'input2', 'input3'])
    monkeypatch.setattr('builtins.input', lambda x: next(inputs))
    my_program
    # now do some assertion with some file comparison
    # pseudocode
    assert filecompare.cmp(expectedfile, actualfile)

Isso só parece estar a executar o programa original e eu acho que é para fazer com a declaração de importação i.e. ele nunca está executando o test_1(), provavelmente porque eu nunca chamá-lo? Qualquer ajuda seria apreciada!

monkeypatching pytest python python-3.x
2021-11-24 03:37:36
1

Melhor resposta

2

Sem fornecer seu my_program o código é difícil dizer o que está acontecendo.

Desde que você está mencionando import problemas, eu acho que a sua não definição main() e if __name__ == "__main__".

Aqui está um pequeno exemplo de como você pode testar isso.

Primeiro, a estrutura de seu my_program ter main função que contém o código e, em seguida, adicionar if __name__ == "__main__" o que irá permitir que você para executar main se a função my_program é executado diretamente, mas também para importar my_program como o módulo para outros arquivos (sem executá-lo, para mais informações, por favor consulte: o Que não se nome == "principal": o fazer?).

my_program:

def main():
    x = input()
    y = input()
    z = input()
    with open("test", "w") as f_out:
        f_out.write(f"{x}-{y}-{z}")


if __name__ == "__main__":
    main()

Agora você pode criar uma test.py arquivo e testar o main função de my_program:

import os
import filecmp
import my_program


def test_success(monkeypatch):
    inputs = ["input1", "input2", "input3"]
    monkeypatch.setattr("builtins.input", lambda: next(iter(inputs)))
    my_program.main()
    with open("expected", "w") as f_out:
        f_out.write("-".join(inputs))
    assert filecmp.cmp("expected", "test")
    os.remove("test")
    os.remove("expected")


def test_fail(monkeypatch):
    inputs = ["input1", "input2", "input3"]
    monkeypatch.setattr("builtins.input", lambda: next(iter(inputs)))
    my_program.main()
    with open("expected", "w") as f_out:
        f_out.write("something-else-test")
    assert not filecmp.cmp("expected", "test")
    os.remove("test")
    os.remove("expected")

Este é um exemplo para que eu usei os.remove para excluir os arquivos. O ideal seria definir luminárias em seus testes para o uso tempfile e random gera arquivos temporários, o qual será automaticamente apagado depois de seus testes.

2021-11-27 23:57:25

Graças a este ajudou muito! O principal aspecto que eu tenho desta era para abranger my_program com if nome == "principal"e, em seguida, ligue my_program.main() no meu funções de teste. Chamando .main() foi muito importante e algo que eu não conseguia pensar.
Koonj Patel

@KoonjPatel Você é bem-vindo. Estou feliz por ter ajudado!
Vlad Siv

Em outros idiomas

Esta página está em outros idiomas

Русский
..................................................................................................................
Italiano
..................................................................................................................
Polski
..................................................................................................................
Română
..................................................................................................................
한국어
..................................................................................................................
हिन्दी
..................................................................................................................
Français
..................................................................................................................
Türk
..................................................................................................................
Česk
..................................................................................................................
ไทย
..................................................................................................................
中文
..................................................................................................................
Español
..................................................................................................................
Slovenský
..................................................................................................................