Bir Python Programını test etmek için Pytest'i kullanma

0

Soru

Python Programlamasında oldukça yeniyim ve Pytest kullanarak test etme konusunda bir sorum var. Üst düzeyde, 3 adet kullanıcı girişi alan ve sonunda bir metin dosyası oluşturan bir programım var. Testlerim için, temel olarak programımın çıkardığı dosyaları, olması gerekenlerle karşılaştırmak istiyorum.

Şimdi, teste nasıl devam edeceğimden emin değilim. Programın kendisi herhangi bir argüman almaz, ancak simüle etmek için monkeypatch kullanacağım 3 adet kullanıcı girdisine dayanır. Adında yeni bir python dosyası oluşturuyor muyum program_test.py ve burada orijinal programı çağıran yöntemler var mı? Bunu denedim, ancak orijinal programı çağırmakta ve simüle edilmiş girdileri göndermekte sorun yaşıyorum. Ya da orijinal programda testlerim var mı (ki bu benim için pek mantıklı değil).

Bunun gibi bir şey istiyorum :

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)

Bu sadece orijinal programı çalıştırıyor gibi görünüyor ve sanırım import ifadesiyle ilgisi var, yani asla test_1 () çalıştırmıyor, muhtemelen hiç çağırmadığım için mi? Herhangi bir yardım takdir edilecektir!

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

En iyi cevabı

2

Sağlamaksızın my_program kod neler olduğunu söylemek zor.

Madem söz ediyorsun import sorunlar, sanırım tanımlamıyorsun. main() ve if __name__ == "__main__".

İşte bunu nasıl test edebileceğinize dair küçük bir örnek.

İlk olarak, yapınızı my_program olmak main kodu içeren ve daha sonra ekleyen işlev if __name__ == "__main__" hangi çalıştırmak için izin verir main işlev eğer my_program doğrudan da idam ama almak için my_program diğer dosyalara modül olarak (çalıştırmadan, daha fazla bilgi için lütfen bakınız: İf name == "main": ne yapar?).

programım_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()

Şimdi bir tane oluşturabilirsiniz test.py dosyalayın ve test edin main fonksiyonu 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")

Bu bir örnek, bu yüzden kullandım os.remove dosyaları silmek için. İdeal olarak, testlerinizde kullanılacak fikstürleri tanımlarsınıztempfile ve testlerinizden sonra otomatik olarak silinecek rastgele geçici dosyalar oluşturun.

2021-11-27 23:57:25

Teşekkürler bu çok yardımcı oldu! Bundan aldığım ana husus, my_program'ı if name = = "main": ile kapsamak ve ardından my_program'ı çağırmaktı.test işlevlerimde main (). Arama .main() oldukça önemliydi ve düşünemediğim bir şeydi.
Koonj Patel

@ KoonjPatel Rica ederim. Yardım ettiğime sevindim!
Vlad Siv

Diğer dillerde

Bu sayfa diğer dillerde

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