Saya memiliki direktori yang berisi tes unit Python saya. Setiap modul tes unit berbentuk tes _ *. Py . Saya mencoba membuat file bernama all_test.py yang akan, Anda dapat menebaknya, menjalankan semua file dalam formulir tes yang disebutkan di atas dan mengembalikan hasilnya. Saya telah mencoba dua metode sejauh ini; keduanya gagal. Saya akan menunjukkan dua metode, dan saya berharap seseorang di luar sana tahu bagaimana sebenarnya melakukan ini dengan benar.
Untuk upaya pertama saya yang berani, saya berpikir "Jika saya hanya mengimpor semua modul pengujian saya di file, dan kemudian memanggil barang ini unittest.main()
, itu akan berhasil, kan?" Ya, ternyata saya salah.
import glob
import unittest
testSuite = unittest.TestSuite()
test_file_strings = glob.glob('test_*.py')
module_strings = [str[0:len(str)-3] for str in test_file_strings]
if __name__ == "__main__":
unittest.main()
Ini tidak berhasil, hasil yang saya dapatkan adalah:
$ python all_test.py
----------------------------------------------------------------------
Ran 0 tests in 0.000s
OK
Untuk percobaan kedua saya, saya kira, oke, mungkin saya akan mencoba melakukan pengujian keseluruhan ini dengan cara yang lebih "manual". Jadi saya mencoba melakukan itu di bawah ini:
import glob
import unittest
testSuite = unittest.TestSuite()
test_file_strings = glob.glob('test_*.py')
module_strings = [str[0:len(str)-3] for str in test_file_strings]
[__import__(str) for str in module_strings]
suites = [unittest.TestLoader().loadTestsFromName(str) for str in module_strings]
[testSuite.addTest(suite) for suite in suites]
print testSuite
result = unittest.TestResult()
testSuite.run(result)
print result
#Ok, at this point I have a result
#How do I display it as the normal unit test command line output?
if __name__ == "__main__":
unittest.main()
Ini juga tidak berhasil, tetapi tampaknya sangat dekat!
$ python all_test.py
<unittest.TestSuite tests=[<unittest.TestSuite tests=[<unittest.TestSuite tests=[<test_main.TestMain testMethod=test_respondes_to_get>]>]>]>
<unittest.TestResult run=1 errors=0 failures=0>
----------------------------------------------------------------------
Ran 0 tests in 0.000s
OK
Saya sepertinya memiliki beberapa suite, dan saya dapat menjalankan hasilnya. Saya sedikit khawatir tentang fakta bahwa ia mengatakan hanya saya run=1
, sepertinya memang seharusnya begitu run=2
, tetapi ini adalah kemajuan. Tetapi bagaimana saya meneruskan dan menampilkan hasilnya ke main? Atau bagaimana saya membuatnya pada dasarnya bekerja sehingga saya bisa menjalankan file ini, dan dengan demikian, jalankan semua tes unit dalam direktori ini?
sumber
Jawaban:
Dengan Python 2.7 dan lebih tinggi Anda tidak perlu menulis kode baru atau menggunakan alat pihak ketiga untuk melakukan ini; eksekusi tes rekursif melalui baris perintah built-in. Masukkan ke
__init__.py
dalam direktori pengujian Anda dan:Anda dapat membaca lebih lanjut di dokumentasi python 2.7 atau python 3.x unittest.
sumber
Anda dapat menggunakan pelari ujian yang akan melakukan ini untuk Anda. Hidung sangat bagus misalnya. Saat dijalankan, ia akan menemukan tes di pohon saat ini dan menjalankannya.
Diperbarui:
Ini beberapa kode dari masa pra-hidung saya. Anda mungkin tidak ingin daftar nama modul yang eksplisit, tetapi mungkin sisanya akan berguna bagi Anda.
sumber
Di python 3, jika Anda menggunakan
unittest.TestCase
:__init__.py
file kosong (atau sebaliknya) ditest
direktori Anda ( harus dinamaitest/
)test/
cocok dengan polatest_*.py
. Mereka dapat berada di dalam subdirektori di bawahtest/
, dan subdirektori tersebut dapat dinamai apa saja.Kemudian, Anda dapat menjalankan semua tes dengan:
Selesai! Sebuah solusi kurang dari 100 baris. Semoga pemula python lain menghemat waktu dengan menemukan ini.
sumber
Ini sekarang mungkin langsung dari unittest: unittest.TestLoader.discover .
sumber
.... ---------------------------------------------------------------------- Ran 4 tests in 0.000s OK
Mengapa? Bedanya, dari mana asalnya?python file.py
Nah dengan mempelajari kode di atas sedikit (khusus menggunakan
TextTestRunner
dandefaultTestLoader
), saya bisa mendapatkan cukup dekat. Akhirnya saya memperbaiki kode saya dengan hanya meneruskan semua test suite ke konstruktor suite tunggal, daripada menambahkannya "secara manual", yang memperbaiki masalah saya yang lain. Jadi, inilah solusi saya.Ya, mungkin lebih mudah menggunakan hidung daripada melakukan ini, tapi itu intinya.
sumber
Jika Anda ingin menjalankan semua tes dari berbagai kelas kasus tes dan Anda senang menentukannya secara eksplisit maka Anda dapat melakukannya seperti ini:
di mana
uclid
proyek saya danTestSymbols
danTestPatterns
merupakan subclass dariTestCase
.sumber
TestSuite
menerima iterable sebagai argumen, Anda bisa membuat kata iterable dalam satu loop untuk menghindari pengulanganloader.loadTestsFromTestCase
.Saya telah menggunakan
discover
metode dan kelebihanload_tests
untuk mencapai hasil ini dalam baris kode (minimal, menurut saya):Eksekusi pada balita kira-kira seperti itu
sumber
Saya mencoba berbagai pendekatan tetapi semua tampaknya cacat atau saya harus membuat beberapa kode, itu menjengkelkan. Tapi ada cara yang meyakinkan di linux, yaitu hanya dengan menemukan setiap tes melalui pola tertentu dan kemudian memohonnya satu per satu.
dan yang paling penting, itu pasti berhasil.
sumber
Dalam hal pustaka atau aplikasi terpaket , Anda tidak ingin melakukannya.
setuptools
akan melakukannya untukmu .Katakan saja di mana paket pengujian root Anda, seperti:
Dan lari
python setup.py test
.Penemuan berbasis file mungkin bermasalah di Python 3, kecuali Anda menghindari impor relatif di suite pengujian Anda, karena
discover
menggunakan impor file. Meskipun mendukung opsionaltop_level_dir
, tetapi saya memiliki beberapa kesalahan rekursi tak terbatas. Jadi solusi sederhana untuk kode yang tidak dikemas adalah dengan memasukkan yang berikut dalam__init__.py
paket pengujian Anda (lihat load_tests Protocol ).sumber
Saya menggunakan PyDev / LiClipse dan belum benar-benar tahu cara menjalankan semua tes sekaligus dari GUI. (edit: Anda klik kanan folder tes root dan pilih
Run as -> Python unit-test
Ini adalah solusi saya saat ini:
Saya memasukkan kode ini dalam modul yang disebut
all
di direktori pengujian saya. Jika saya menjalankan modul ini sebagai yang terbaik dari LiClipse maka semua tes dijalankan. Jika saya meminta hanya mengulang tes tertentu atau gagal maka hanya tes yang dijalankan. Itu tidak mengganggu pelari uji commandline saya (nosetests) - diabaikan.Anda mungkin perlu mengubah argumen
discover
berdasarkan pengaturan proyek Anda.sumber
Berdasarkan jawaban Stephen Cagle I menambahkan dukungan untuk modul tes bersarang.
Kode mencari semua subdirektori
.
untuk*Tests.py
file yang kemudian dimuat. Diharapkan masing*Tests.py
- masing berisi kelas tunggal*Tests(unittest.TestCase)
yang dimuat pada gilirannya dan dieksekusi satu demi satu.Ini berfungsi dengan bersarang dalam direktori / modul yang bersarang, tetapi setiap direktori di antaranya perlu mengandung
__init__.py
file kosong setidaknya. Ini memungkinkan pengujian memuat modul bersarang dengan mengganti garis miring (atau garis miring terbalik) dengan titik (lihatreplace_slash_by_dot
).sumber
Ini adalah pertanyaan lama, tetapi apa yang berhasil bagi saya sekarang (pada tahun 2019) adalah:
Semua file pengujian saya berada di folder yang sama dengan file sumber dan berakhir dengan
_test
.sumber
Karena penemuan Uji tampaknya menjadi subjek yang lengkap, ada beberapa kerangka kerja khusus untuk menguji penemuan:
Lebih banyak membaca di sini: https://wiki.python.org/moin/PythonTestingToolsTaxonomy
sumber
Skrip BASH ini akan mengeksekusi direktori uji python unittest dari MANA SAJA dalam sistem file, tidak peduli apa direktori tempat Anda berada: direktori kerjanya selalu berada di tempat
test
direktori itu berada.SEMUA UJI, $ PWD independen
modul Python unittest sensitif terhadap direktori Anda saat ini, kecuali Anda mengatakannya di mana (menggunakan
discover -s
opsi).Ini berguna ketika tetap berada di direktori kerja
./src
atau./example
dan Anda membutuhkan tes unit keseluruhan cepat:UJI TERPILIH, independen $ PWD
Saya beri nama file utilitas ini:
runone.py
dan menggunakannya seperti ini:Tidak perlu untuk
test/__init__.py
file membebani paket Anda / memori-overhead selama produksi.sumber
Inilah pendekatan saya dengan membuat pembungkus untuk menjalankan tes dari baris perintah:
Demi kesederhanaan, permisi non- PEP8 saya standar pengkodean .
Kemudian Anda bisa membuat kelas BaseTest untuk komponen umum untuk semua tes Anda, sehingga setiap tes Anda akan terlihat seperti:
Untuk menjalankan, Anda cukup menentukan tes sebagai bagian dari argumen baris perintah, misalnya:
sumber