Nonaktifkan pengujian unit Python individu untuk sementara

128

Bagaimana pengujian unit individual dinonaktifkan sementara saat menggunakan unittestmodul dengan Python?

coelhudo
sumber

Jawaban:

230

Metode atau kelas pengujian individual dapat dinonaktifkan menggunakan unittest.skipdekorator.

@unittest.skip("reason for skipping")
def test_foo():
    print('This is foo test case.')


@unittest.skip  # no reason needed
def test_bar():
    print('This is bar test case.')

Untuk opsi lainnya, lihat dokumen untuk Melewati pengujian dan kemungkinan kegagalan .

yoni
sumber
9
Dengan Python 3, jawaban Akif di bawah ini @unittest.SkipTestberfungsi dan tidak@unittest.skip
keseimbangan kehidupan
7
Saya menggunakan Python 3.6.1 dan @unittest.skipberfungsi juga dengan baik.
Pete
2
@Pete, dengan Python 3.4.0, @unittest.skiptidak berfungsi.
keseimbangan kehidupan
Bagaimana cara mencegah agar kelas anak tidak dilewati?
reubenjohn
Anotasi hanya akan diterapkan ke satu metode pengujian. Apakah Anda bermaksud untuk memiliki kelas induk dengan metode pengujian, dan hanya beberapa kelas anak yang metode ini dinonaktifkan? Saya membayangkan itu mungkin, meskipun Anda mungkin perlu merancang kelas orang tua / anak dengan tepat. Bisakah Anda menjelaskan skenario yang Anda coba pecahkan dengan contoh mainan?
yoni
26

Anda dapat menggunakan dekorator untuk menonaktifkan pengujian yang dapat menggabungkan fungsi dan mencegah pengujian unit googletest atau python untuk menjalankan testcase.

def disabled(f):
    def _decorator():
        print f.__name__ + ' has been disabled'
    return _decorator

@disabled
def testFoo():
    '''Foo test case'''
    print 'this is foo test case'

testFoo()

Keluaran:

testFoo has been disabled
GTM
sumber
11

Versi terbaru (2.7 - belum dirilis) mendukung pengujian melewatkan / menonaktifkan seperti itu . Anda bisa mendapatkan modul ini dan menggunakannya pada instalasi Python Anda yang sudah ada. Ini mungkin akan berhasil.

Sebelum ini, saya digunakan untuk mengubah nama tes saya ingin melewatkan untuk xtest_testnamedari test_testname.


Berikut skrip elisp cepat untuk melakukan ini. Elisp saya agak berkarat jadi saya mohon maaf sebelumnya atas masalah yang dimilikinya. Belum dicoba.

  (defun disable_enable_test ()
  (interactive "")
  (save-excursion
    (beginning-of-line)
    (search-forward "def")
    (forward-char)
    (if (looking-at "disable_")
    (zap-to-char 1 ?_)
      (insert "disable_"))))
Noufal Ibrahim
sumber
+1, tetapi di seluruh proyek yang sedang saya kerjakan, semua orang menggunakan python v2.6.2, dan menurut saya ini tidak akan berubah: /, tapi ini solusinya, terima kasih
coelhudo
Anda dapat mengubah sedikit editor Anda untuk memberi Anda makro untuk mengaktifkan / menonaktifkan testcase tetapi saya berbicara sebagai pengguna Emacs jadi ... :)
Noufal Ibrahim
Saya juga pengguna Emacs, apakah Anda membuat makro?
coelhudo
Nggak. Saya hanya membiarkan mereka gagal tetapi tidak sesulit itu. Saya telah memperbarui jawabannya dengan kilat.
Noufal Ibrahim
Jawaban yang diterima ini bukanlah jawaban, hanya tautan. Jawaban yang sebenarnya dan saat ini bukanlah jawaban yang paling banyak dipilih. Memang, umurnya 4 tahun. Elisp serampangan hanya mengaburkan.
jwd630
10

Cukup menempatkan @unittest.SkipTestdekorator di atas tes sudah cukup.

Akif
sumber
Saya tidak tahu siapa yang melakukannya. Tapi, saya sedang membaca dokumentasinya dan dikatakan bahwa SkipTest adalah pengecualian. Bagaimanapun, ini berbeda dari unittest.skip dalam arti bahwa skip tidak pernah mengeksekusi tes (membuatnya dinonaktifkan), sementara tujuan SkipTest dimunculkan jika sesuatu yang tidak diharapkan terjadi saat tes dijalankan. Apakah saya benar? Menarik dan tangguh.
coelhudo
unittest.skip(tanpa alasan) memberi saya kesalahan pada Python 2 tetapi tidak pada Python 3.
Akif
5

Saya baru saja mengganti nama metode kasus uji dengan garis bawah: test_myfunc menjadi _test_myfunc.

MattK
sumber
3

The docs untuk 2.1 tidak menentukan mengabaikan atau melewatkan metode.

Namun biasanya, saya memblokir komentar bila diperlukan.

Finglas
sumber
1

Berfokus pada bagian pertanyaan yang "dinonaktifkan sementara", jawaban terbaik agak tergantung pada kasus penggunaan. Kasus penggunaan yang membawa saya ke sini adalah saya melakukan pengembangan berdasarkan pengujian pada suatu fungsi. Dalam proses ini, saya menulis tes secara berturut-turut dan sering menggunakan break point dalam fungsi untuk debugging. Jika saya hanya menjalankan semua tes setiap kali saya menjalankan test runner, saya akhirnya berhenti di break point untuk tes yang sudah berfungsi. Menambahkan "lewati" atau memungut nama pengujian atau sesuatu seperti itu bukanlah yang saya inginkan karena ketika saya selesai menulis fungsi, saya ingin semua pengujian berjalan. Jika saya menggunakan "lewati", saya harus kembali dan "batalkan".

Untuk kasus penggunaan saya, solusinya terletak pada runner pengujian, bukan pada kode pengujian. Saya menggunakan pytest . Dengan pytest, mudah untuk menentukan satu pengujian dari baris perintah:

pytest PYTHON_FILENAME.TEST_CLASS.TEST_NAME

(ganti tutup dengan nilai Anda).

Saya mengerti pertanyaan itu adalah untuk python-unitest. Saya sudah lama tidak menggunakannya. Saya tidak akan terkejut jika itu memiliki sesuatu yang mirip dengan pytest. Jika tidak, Anda dapat dengan mudah beralih ke pytest. Anda tidak perlu mengubah kode Anda. Cukup instal dan ubah perintah runner pengujian Anda.

Juga, saya menggunakan PyCharm Pro. Di halaman yang menunjukkan kode tes saya, ada ikon kecil di sebelah def untuk setiap tes. Saya dapat mengklik ikon itu dan menjalankan pengujian itu satu per satu.

Membuang
sumber