Saya percaya ini adalah kesalahpahaman dengan cara apa pun yang dapat saya pikirkan.
Kode uji yang menguji kode produksi sama sekali tidak sama. Saya akan menunjukkan dengan python:
def multiply(a, b):
"""Multiply ``a`` by ``b``"""
return a*b
Maka tes sederhana adalah:
def test_multiply():
assert multiply(4, 5) == 20
Kedua fungsi memiliki definisi yang sama tetapi keduanya melakukan hal yang sangat berbeda. Tidak ada kode duplikat di sini. ;-)
Itu juga terjadi bahwa orang menulis tes duplikat pada dasarnya memiliki satu pernyataan per fungsi tes. Ini kegilaan dan saya telah melihat orang-orang melakukan ini. Ini adalah praktik yang buruk.
def test_multiply_1_and_3():
"""Assert that a multiplication of 1 and 3 is 3."""
assert multiply(1, 3) == 3
def test_multiply_1_and_7():
"""Assert that a multiplication of 1 and 7 is 7."""
assert multiply(1, 7) == 7
def test_multiply_3_and_4():
"""Assert that a multiplication of 3 and 4 is 12."""
assert multiply(3, 4) == 12
Bayangkan melakukan ini untuk 1000+ baris kode yang efektif. Alih-alih, Anda menguji berdasarkan per 'fitur':
def test_multiply_positive():
"""Assert that positive numbers can be multiplied."""
assert multiply(1, 3) == 3
assert multiply(1, 7) == 7
assert multiply(3, 4) == 12
def test_multiply_negative():
"""Assert that negative numbers can be multiplied."""
assert multiply(1, -3) == -3
assert multiply(-1, -7) == 7
assert multiply(-3, 4) == -12
Sekarang ketika fitur ditambahkan / dihapus saya hanya perlu mempertimbangkan untuk menambah / menghapus satu fungsi tes.
Anda mungkin telah memperhatikan saya belum menerapkan for
loop. Ini karena mengulangi beberapa hal itu baik. Ketika saya akan menerapkan loop kode akan jauh lebih pendek. Tetapi ketika sebuah pernyataan gagal, itu bisa mengaburkan keluaran yang menampilkan pesan yang ambigu. Jika ini terjadi maka pengujian Anda akan kurang bermanfaat dan Anda akan memerlukan debugger untuk memeriksa kesalahan yang terjadi.