Ikhtisar multibahasa tentang cara menguji kode proyek penelitian Anda – Beragampengetahuan
Oleh: Julia | Victor Bousange
Diposting ulang dari:
Pengujian kode sangat penting untuk mengidentifikasi dan memperbaiki potensi masalah, menjaga kewarasan selama pengembangan proyek, dan mengidentifikasi kesalahan dengan cepat, sekaligus memastikan keandalan dan kejelasan Uji milik Anda dari waktu ke waktu.
Postingan ini adalah bagian dari seri praktik terbaik untuk mengelola kode proyek penelitian. Sebagian besar materi ini dikembangkan bekerja sama dengan Mauro Werder sebagai bagian dari Kursus Penelitian yang Dapat Direproduksi, Saluran Data, dan Komputasi Ilmiah (CORDS). Jika Anda memiliki pengalaman untuk dibagikan atau menemukan kesalahan, silakan menghubungi kami!
Contents
Isi
Pengujian satuan
Pengujian unit melibatkan pengujian unit kode, biasanya fungsi tunggal, untuk memastikan kebenarannya. Berikut beberapa aspek penting yang perlu dipertimbangkan:
- Periksa keakuratan dengan input tipikal.
- Uji kasus tepi.
- Periksa kesalahan dengan input yang buruk.
Beberapa pengembang mulai menulis pengujian unit sebelum menulis fungsi sebenarnya, sebuah praktik yang dikenal sebagai Test-Driven Development (TDD). Identifikasi perilaku fungsi di bagian hulu pada selembar kertas, tulis pengujian yang sesuai, dan ketika semua pengujian lulus, Anda selesai. Filosofi ini memastikan bahwa Anda menerapkan implementasi yang telah teruji dengan baik dan menghindari pengembangan fitur yang tidak perlu, sehingga memaksa Anda untuk fokus hanya pada hal yang diperlukan. Meskipun TDD adalah ide yang kuat, kepatuhan yang ketat dapat menjadi sebuah tantangan.
Ide yang bagus adalah menulis tes tambahan ketika Anda menemukan kesalahan dalam kode Anda.
Tes resmi ringan assert
Bentuk pengujian unit yang paling sederhana mencakup beberapa jenis assert menyatakan.
ular piton
def fib(x):
if x <= 2:
return 1
else:
return fib(x - 1) + fib(x - 2)
assert fib(0) == 0
assert fib(1) == 1
assert fib(2) == 1
Julia
Saat pengujian gagal, Anda akan mendapatkan kesalahan untuk pengujian terkait, yang harus Anda perbaiki untuk menguji pengujian berikutnya.
Di Julia atau Python Anda dapat mengaturnya secara langsung assert deklarasikan setelah fungsi Anda. Dengan cara ini pengujian akan dijalankan setiap kali Anda menjalankan skrip. Ini bukan pendekatan Pythonic, yang dapat digunakan untuk pengujian terpisah
def fib(x):
if x <= 2:
return 1
else:
return fib(x - 1) + fib(x - 2)
if __name__ == '__main__':
assert fib(0) == 0
assert fib(1) == 1
assert fib(2) == 1
assert fib(6) == 8
assert fib(40) == 102334155
print("Tests passed")
Pertimbangkan untuk menggunakan np.isclose, np.testing.assert_allclose (Piton) atau approx (Julia) untuk perbandingan floating point.
Bereksperimenlah dengan rangkaian pengujian
Jika Anda memiliki beberapa pengujian, Anda harus mengelompokkannya ke dalam rangkaian pengujian dan menjalankannya menggunakan test runner. Pendekatan ini akan menjalankan semua pengujian, meskipun beberapa pengujian gagal, dan mengambil serta memberikan informasi tentang pengujian yang lulus dan pengujian yang gagal. Seperti yang akan Anda lihat, ini juga memungkinkan untuk menjalankan pengujian secara otomatis pada setiap penerapan dengan kemampuan integrasi berkelanjutan.
ular piton
Dua kerangka utama untuk pengujian unit dengan Python adalah pytest Dan unittestdengan pytest menjadi lebih populer.
Contoh penggunaan pytest:
from src.fib import fib
import pytest
def test_typical():
assert fib(1) == 1
assert fib(2) == 1
assert fib(6) == 8
assert fib(40) == 102334155
def test_edge_case():
assert fib(0) == 0
def test_raises():
with pytest.raises(NotImplementedError):
fib(-1)
with pytest.raises(NotImplementedError):
fib(1.5)
Jalankan pengujian dengan:
Julia
Modul terintegrasi Testberdasarkan makro @test. Pertimbangkan untuk mengelompokkan pengujian Anda dengan
julia> @testset "trigonometric identities" begin
θ = 2/3*π
@test sin(-θ) ≈ -sin(θ)
@test cos(-θ) ≈ cos(θ)
@test sin(2θ) ≈ 2*sin(θ)*cos(θ)
@test cos(2θ) ≈ cos(θ)^2 - sin(θ)^2
end;
Ini akan menghasilkan hasil yang baik
Test Summary: | Pass Total Time
trigonometric identities | 4 4 0.2s
Sangat berguna untuk mengelompokkan tes yang diterapkan pada satu fungsi atau konsep. Fungsi pengujian mungkin memerlukan paket tambahan untuk lingkungan kerja minimum yang ditentukan di root paket. Lingkungan virtual tambahan dapat ditentukan untuk pengujian! Untuk mengembangkan pengujian saya secara interaktif, saya suka menggunakan TestEnv. Sayangnya, menggunakan Pkg.activate DI DALAM tests tidak akan bekerja di sana, kamu. Anda membutuhkan TestEnv untuk mendapatkan akses ke fungsi paket Anda;
Di lingkungan paket Anda,
using TestEnv
TestEnv.activate()
akan mengaktifkan lingkungan pengujian.
Untuk mengaktifkan kembali lingkungan normal,
Pkg.activate(".")
Ini adalah topik yang bagus untuk dibaca lebih lanjut.
R
testhat
Uji fungsi dan kelas yang tidak murni
Untuk fungsi non-deterministik, berikan seed acak atau variabel yang diperlukan fungsi tersebut sebagai argumen untuk menjadikannya deterministik.
Untuk fungsi stateful, periksa kondisi pasca untuk memastikan keadaan internal berubah seperti yang diharapkan.
Untuk fungsi dengan efek samping I/O, buat file simulasi untuk memverifikasi pembacaan input yang benar dan output yang diharapkan.
ular piton
def file_to_upper(in_file, out_file):
fout = open(out_file, 'w')
with open(in_file, 'r') as f:
for line in f:
fout.write(line.upper())
fout.close()
import tempfile
import os
def test_file_to_upper():
in_file = tempfile.NamedTemporaryFile(delete=False, mode='w')
out_file = tempfile.NamedTemporaryFile(delete=False)
out_file.close()
in_file.write("test123\nthetest")
in_file.close()
file_to_upper(in_file.name, out_file.name)
with open(out_file.name, 'r') as f:
data = f.read()
assert data == "TEST123\nTHETEST"
os.unlink(in_file.name)
os.unlink(out_file.name)
Integrasi berkelanjutan
Pengujian otomatis pada mesin lokal memang berguna, tetapi Anda dapat melakukannya lebih baik dengan integrasi berkelanjutan (CI). Faktanya, CI sangat penting untuk proyek yang melibatkan banyak pengembang dan platform target berbeda. CI melibatkan menjalankan tes setiap kali ada perubahan.
CI juga dapat digunakan untuk membuat dokumentasi secara otomatis, memeriksa cakupan kode, dll. GitHub Actions adalah alat CI populer yang tersedia di GitHub.
berbasis CI .yaml file yang menentukan lingkungan untuk menjalankan skrip. Anda dapat membuat matriks untuk diuji pada lingkungan yang berbeda (misalnya Linux, Windows dan MacOS, dengan versi python atau Julia yang berbeda). Pekerjaan akan dibuat untuk menjalankan pengujian kami untuk setiap permutasi ini.
Contoh file CI.yaml untuk Julia
name: Run testson: push: branches: - master - main pull_request:
permissions: actions: write contents: read
jobs: test: runs-on: $ matrix.os strategy: matrix: julia-version: [‘1.6’, ‘1’, ’nightly’] julia-arch: [x64, x86] os: [ubuntu-latest, windows-latest, macOS-latest] exclude: - os: macOS-latest julia-arch: x86
steps: - uses: actions/checkout@v4 - uses: julia-actions/setup-julia@v1 with: version: $ matrix.julia-version arch: $ matrix.julia-arch - uses: julia-actions/cache@v1 - uses: julia-actions/julia-buildpkg@v1 - uses: julia-actions/julia-runtest@v1
Contoh file CI.yaml untuk Python
Tindakan ini menginstal apa yang disebut lingkungan conda glacier-mass-balanceditentukan dalam environment.yml dokumen.
Kemudian berjalan pytestDengan asumsi Anda memilikinya test/ folder yang berisi fungsi Anda. Mari kita coba dulu pytest beroperasi secara lokal. Jangan lupa ya pytest dalam ketergantungan Anda.
name: Run tests
on: push
jobs:
miniconda:
name: Miniconda $ matrix.os
runs-on: $ matrix.os
strategy:
matrix:
os: ["ubuntu-latest"]
steps:
- uses: actions/checkout@v2
- uses: conda-incubator/setup-miniconda@v2
with:
environment-file: environment.yml
activate-environment: glacier-mass-balance
auto-activate-base: false
- name: Run pytest
shell: bash -l
run: |
pytest
Tip yang bagus
Anda dapat menambahkan lencana menarik untuk menunjukkan secara visual apakah tes Anda lulus atau gagal, misalnya.
Anda bisa mendapatkan kode untuk lencana ini dengan masuk ke repositori github Anda, lalu masuk ke Tindakan. Klik tindakan tes, lalu klik kanan atas ... dan `Buat lencana status“`.
Hebat, bukan?
Jenis tes lainnya
- Periksa rantai dokumen: Tes unit tertanam dalam docstring.
- Pengujian integrasi: Periksa apakah beberapa fungsi berfungsi bersama dengan benar.
- Pengujian regresi: Pastikan kode Anda menghasilkan keluaran yang sama dengan versi sebelumnya.
Sumber daya
Bawa pulang pesan
- Menerapkan pengujian secara sistematis memungkinkan Anda memastikan kebenaran kode Anda
- Biaya keseluruhan pengujian sering kali seimbang dengan berkurangnya waktu yang dihabiskan untuk mengidentifikasi cacat.
Terkait
Software Terbaru Saat Ini
Aplikasi yang sedang trend saat ini
object oriented programming, programming language, programming adalah, web programming, belajar programming, tournament software, software, software adalah, contoh software, apa itu software, pengertian software, aplikasi, aplikasi penghasil uang, aplikasi bokep, aplikasi video, programming
#Ikhtisar #multibahasa #tentang #cara #menguji #kode #proyek #penelitian #Anda