Memperkenalkan Pengujian dengan Python. Bagian 3

Teman, kami punya kabar baik untuk Anda. Pertama, matahari akhirnya bersinar di jalan, yang berarti bahwa musim semi mulai sepenuhnya mengambil alih hak-haknya. Berita kedua lebih khusus - pada 20 Maret, pelajaran pertama dimulai di utas baru pada kursus "Pengembang Python" , sehubungan dengan ini kami menerbitkan bagian akhir dari artikel "Pengantar Pengujian dengan Python", bagian sebelumnya dapat dibaca di sini dan di sini .

Menguji dalam Berbagai Lingkungan

Sejauh ini, Anda telah menguji coba untuk satu versi Python menggunakan lingkungan virtual dengan serangkaian dependensi tertentu. Tetapi mungkin selalu ada kebutuhan untuk menguji aplikasi pada beberapa versi Python atau beberapa versi paket. Tox adalah aplikasi yang mengotomatiskan pengujian di berbagai lingkungan.



Instalasi Tox

Tox tersedia di PyPl sebagai paket untuk diinstal melalui pip:

$ pip install tox 

Setelah instalasi, Anda dapat melanjutkan untuk mengkonfigurasi Tox.

Menyesuaikan Toks Untuk Ketergantungan Anda

Tox dikonfigurasi melalui file konfigurasi di direktori proyek. Ini berisi yang berikut:

  • Perintah untuk menjalankan untuk menjalankan tes;
  • Paket tambahan apa pun yang diperlukan untuk dijalankan;
  • Versi target Python dipilih untuk pengujian.

Alih-alih mempelajari sintaks untuk mengonfigurasi Tox, Anda bisa mulai dengan meluncurkan aplikasi mulai cepat.

 $ tox-quickstart 

Alat konfigurasi Tox akan menanyakan pertanyaan dan membuat file yang mirip dengan yang berikut ini di tox.ini :

 [tox] envlist = py27, py36 [testenv] deps = commands = python -m unittest discover 

Sebelum memulai Tox, pastikan setup.py dengan langkah-langkah instalasi untuk paket ada di folder aplikasi. Jika tidak, gunakan panduan pembuatan setup.py .

Dan jika proyek Anda tidak dimaksudkan untuk distribusi di PyPl, Anda dapat melewati persyaratan ini dengan menambahkan baris berikut ke file tox.ini di bawah heading tox :

 [tox] envlist = py27, py36 skipsdist=True 

Jika Anda tidak membuat setup.py, dan aplikasi memiliki beberapa dependensi pada PyPl, Anda perlu mengklarifikasi mereka di bagian testenv . Misalnya, Django akan membutuhkan yang berikut:

 [testenv] deps = django 

Di akhir langkah ini, Anda dapat menjalankan tes.

Sekarang Anda dapat menjalankan Tox, dan itu akan menciptakan dua lingkungan virtual: satu untuk Python 2.7 dan satu untuk Python 3.6. Direktori Tox disebut .tox/ . Di dalamnya, Tox akan menjalankan -m unittest discover untuk setiap lingkungan virtual.

Anda dapat memulai proses ini dengan memanggil Tox dari baris perintah:

 $ tox 

Tox akan menghasilkan hasil tes untuk setiap lingkungan. Saat Anda memulai Tox untuk pertama kalinya, dibutuhkan waktu untuk membuat lingkungan virtual, tetapi ketika Anda menjalankan Tox untuk kedua kalinya, semuanya akan bekerja lebih cepat.
Hasil Tox sangat sederhana. Lingkungan dibuat untuk setiap versi, dependensi diinstal, dan kemudian perintah uji dijalankan.

Ada beberapa opsi baris perintah tambahan yang perlu diingat.
Menjalankan satu lingkungan, misalnya, Python 3.6:

 $ tox -e py36 

Menciptakan kembali lingkungan virtual ketika dependensi berubah atau paket samping rusak:

 $ tox -r 

Menjalankan Tox dengan temuan yang kurang rinci:

 $ tox -q 

Menjalankan Tox dengan lebih banyak keluaran verbose:

 $ tox -v 

Anda dapat membaca lebih lanjut tentang Tox di situs dokumentasi Tox .

Otomasi Tes

Sejauh ini, Anda telah melakukan tes secara manual dengan menjalankan perintah. Tetapi ada alat untuk menjalankan tes secara otomatis ketika perubahan dibuat dan mengkomitnya ke repositori dengan sistem kontrol versi, misalnya, Git. Alat otomasi pengujian sering disebut sebagai alat CI / CD, yang berarti "Integrasi Berkelanjutan / Penerapan Berkelanjutan". Mereka dapat menjalankan tes, mengkompilasi dan mempublikasikan aplikasi, dan bahkan menyebarkannya ke produksi.
Travis CI adalah salah satu dari banyak layanan CI yang tersedia.

Travis CI bekerja dengan baik dengan Python, dan sekarang Anda dapat mengotomatiskan pelaksanaan semua tes yang dibuat di cloud! Travis CI gratis untuk proyek sumber terbuka apa pun di GitHub dan GitLab dan tersedia dengan biaya untuk proyek swasta.

Untuk memulai, masuk dan otentikasi menggunakan kredensial GitHub atau GitLab Anda. Kemudian buat file bernama .travis.yml dengan konten berikut:

 language: python python: - "2.7" - "3.7" install: - pip install -r requirements.txt script: - python -m unittest discover 

Konfigurasi ini memberikan Travis CI petunjuk berikut:

  • Menguji Python 2.7 dan 3.7 (Secara opsional, Anda dapat menggantinya dengan yang lain.)
  • Menginstal semua paket yang tercantum di requirement.txt (Anda dapat menghapus bagian ini jika Anda tidak memiliki dependensi.)
  • Menjalankan python -m unittest temukan untuk menjalankan tes.

Setelah melakukan dan mendorong file ini, Travis CI akan menjalankan perintah ini setiap kali Anda mendorong ke repositori Git jarak jauh Anda. Hasil dapat dilihat di situs web mereka.

Apa selanjutnya

Sekarang Anda tahu cara menulis tes, menambahkannya ke proyek Anda, menjalankannya dan bahkan melakukannya secara otomatis, sehingga Anda bisa berkenalan dengan metode-metode canggih, yang bisa berguna ketika perpustakaan tes tumbuh.

Linter Pengantar Aplikasi

Tox dan Travis CI memiliki pengaturan tim pengujian. Dalam tutorial ini, kami menggunakan python -m unittest find sebagai tim uji.

Anda dapat memberikan satu atau lebih perintah di alat ini, yang akan menambah alat baru untuk meningkatkan kualitas aplikasi.

Salah satu aplikasi tersebut adalah linter. Dia akan melihat kode Anda dan meninggalkan komentar. Dengan demikian, ia dapat memberikan saran tentang kesalahan, mengoreksi ruang jejak dan bahkan mengantisipasi bug potensial.

Untuk mempelajari lebih lanjut tentang linter, lihat Tutorial Kualitas Kode Python .

Pelapisan pasif dengan serpihan8

flake8 adalah linter populer yang meninggalkan komentar tentang gaya kode Anda sesuai dengan spesifikasi PEP 8 .

Anda dapat menginstal flake8 menggunakan pip:

 $ pip install flake8 

Kemudian Anda dapat menjalankan flake8 untuk satu file, folder, atau templat:

 $ flake8 test.py test.py:6:1: E302 expected 2 blank lines, found 1 test.py:23:1: E305 expected 2 blank lines after class or function definition, found 1 test.py:24:20: W292 no newline at end of file 

Anda akan melihat daftar kesalahan dan peringatan dalam kode Anda yang ditemukan oleh flake8 .
flake8 dapat dikonfigurasi pada baris perintah atau dalam file konfigurasi proyek. Jika Anda ingin mengabaikan beberapa aturan, misalnya E305, yang ditunjukkan di atas, Anda dapat mengatur ini dalam konfigurasi. flake8 akan memeriksa file flake8 di folder proyek atau file setup.cfg . Jika Anda ingin menggunakan Tox, Anda dapat menambahkan bagian konfigurasi tox.ini ke tox.ini .

Contoh ini mengabaikan direktori .git dan __pycache__ , serta aturan E305. Selain itu, panjang maksimum string meningkat dari 80 karakter menjadi 90. Anda akan menyadari bahwa batas standar 79 karakter per baris tidak cocok untuk tes yang mungkin berisi nama metode panjang, string literal dengan nilai tes dan potongan data panjang lainnya. Biasanya, untuk pengujian, tambah panjang string menjadi 120 karakter:

 [flake8] ignore = E305 exclude = .git,__pycache__ max-line-length = 90 

Atau, Anda dapat memberikan opsi ini di baris perintah:

 $ flake8 --ignore E305 --exclude .git,__pycache__ --max-line-length=90 

Daftar lengkap pengaturan dapat ditemukan di Situs Dokumentasi .
Sekarang Anda dapat menambahkan flake8 ke pengaturan CI Anda. Untuk Travis CI, akan terlihat seperti ini:

 matrix: include: - python: "2.7" script: "flake8" 

Travis akan membaca konfigurasi di .flake8 dan tidak akan dapat menyelesaikan pembangunan jika ada kesalahan serat. Pastikan Anda menambahkan dependensi flake8 ke file requirements.txt .

Linting Agresif dengan Pemformat Kode

flake8 adalah linter pasif yang hanya merekomendasikan pengeditan, Anda harus memasukkannya sendiri ke dalam kode. Pemformat kode adalah pendekatan yang lebih agresif. Itu mengubah kode secara otomatis sesuai dengan gaya dan tata letak.

black adalah formatter yang sangat tak terhindarkan. Tidak memiliki pengaturan dan sangat teliti. Yang membuatnya menjadi alat yang hebat untuk dimasukkan ke dalam pipa uji Anda.

Harap dicatat: hitam membutuhkan Python versi 3.6 dan lebih tinggi.

Anda dapat menginstal black menggunakan pip:

 $ pip install black 

Kemudian, untuk memulai dari baris perintah, tentukan file atau direktori yang ingin Anda format:

 $ black test.py 

Jaga Kode Tes Bersih

Anda mungkin memperhatikan bahwa saat menulis tes, Anda akan menyalin dan menempelkan fragmen kode lebih sering daripada saat membuat aplikasi biasa. Dari waktu ke waktu, tes bisa sangat monoton, tetapi ini bukan alasan untuk menjatuhkan kode dalam bentuk yang tidak akurat dan terfragmentasi.

Seiring waktu, hutang teknis akan terakumulasi dalam kode pengujian Anda, dan membuat perubahan yang diperlukan untuk perubahan signifikan dalam kode aplikasi dalam pengujian akan berubah menjadi sangat sulit hanya karena strukturnya.

Saat menulis tes, coba ikuti prinsip KERING: Jangan Ulangi Diri Anda.

Perlengkapan uji dan fungsi adalah cara terbaik untuk menulis kode yang mudah dipelihara. Juga, jangan lupa tentang kemudahan membaca. Pertimbangkan untuk menggunakan alat linting seperti flake8 ke kode pengujian Anda:

 $ flake8 --max-line-length=120 tests/ 

Pengujian untuk Mendeteksi Penurunan Produktivitas di antara Suntingan

Ada banyak cara untuk membandingkan kode dalam Python. Perpustakaan standar memiliki modul timeit yang menjadwalkan fungsi beberapa kali dan menunjukkan kepada Anda distribusi. Dalam contoh ini, test () akan dieksekusi 100 kali, dan kemudian output akan diberikan menggunakan print ():

 def test(): # ... your code if __name__ == '__main__': import timeit print(timeit.timeit("test()", setup="from __main__ import test", number=100)) 

Jika Anda memutuskan untuk menggunakan pytest sebagai pelari uji, periksa plugin pytest-benchmark. Ini menyediakan perlengkapan yang disebut benchmark. Setiap objek yang dipanggil dapat melewati patokan (), ia mem-parsing waktu yang disebut dalam hasil pytest.

Anda dapat menginstal pytest-benchmark dari PyPl menggunakan pip:

 $ pip install pytest-benchmark 

Kemudian Anda bisa menambahkan tes menggunakan fixture dan meneruskan objek yang dipanggil ke eksekusi:

 def test_my_function(benchmark): result = benchmark(test) 

Menjalankan pytest akan memberi Anda hasil patokan:



Anda dapat mempelajari lebih lanjut di Situs Dokumentasi .

Pengujian untuk Mengidentifikasi Kesalahan Keamanan

Tes lain yang harus Anda jalankan pada aplikasi Anda adalah memeriksa kesalahan umum dan kerentanan keamanan.

Instal bandit dari PyPl menggunakan pip:

 $ pip install bandit 

Kemudian Anda dapat memberikan nama modul aplikasi Anda dengan flag -r dan mendapatkan informasi singkat:

 $ bandit -r my_sum [main] INFO profile include tests: None [main] INFO profile exclude tests: None [main] INFO cli include tests: None [main] INFO cli exclude tests: None [main] INFO running on Python 3.5.2 Run started:2018-10-08 00:35:02.669550 Test results: No issues identified. Code scanned: Total lines of code: 5 Total lines skipped (#nosec): 0 Run metrics: Total issues (by severity): Undefined: 0.0 Low: 0.0 Medium: 0.0 High: 0.0 Total issues (by confidence): Undefined: 0.0 Low: 0.0 Medium: 0.0 High: 0.0 Files skipped (0): 

Seperti halnya flake8 , bandit flag bandit dapat dikonfigurasi, dan jika Anda ingin mengabaikannya, Anda dapat menambahkan fragmen berikut ke file setup.cfg dengan parameter:

 [bandit] exclude: /test tests: B101,B102,B301 

Informasi lebih lanjut di situs web GitHub .

Kesimpulan

Python telah membuat pengujian tersedia berkat perintah dan pustaka bawaan yang diperlukan untuk memverifikasi operasi aplikasi yang benar. Sangat mudah untuk memulai pengujian dengan Python: Anda bisa menggunakan metode unittest dan menulis metode yang kecil dan mudah dirawat untuk menguji kode.

Saat Anda mempelajari lebih lanjut tentang pengujian dan perluasan aplikasi Anda, pertimbangkan untuk beralih ke salah satu kerangka kerja pengujian seperti pytest untuk mulai menggunakan fitur yang lebih canggih.

Terima kasih sudah membaca. Dapatkan masa depan yang tidak salah lagi dengan Python!

Dan bagi mereka yang telah membaca artikel tersebut, kami memiliki satu lagi berita bagus. Saat ini, Anda bisa mendapatkan kursus Pengembang Python dengan diskon 10.000 rubel!

Bagian pertama
Bagian kedua

Source: https://habr.com/ru/post/id444204/


All Articles