Saya integrasi sedang menguji suatu sistem, dengan hanya menggunakan API publik. Saya memiliki tes yang terlihat seperti ini:
def testAllTheThings():
email = create_random_email()
password = create_random_password()
ok = account_signup(email, password)
assert ok
url = wait_for_confirmation_email()
assert url
ok = account_verify(url)
assert ok
token = get_auth_token(email, password)
a = do_A(token)
assert a
b = do_B(token, a)
assert b
c = do_C(token, b)
# ...and so on...
Pada dasarnya, saya mencoba menguji seluruh "aliran" dari satu transaksi. Setiap langkah dalam aliran tergantung pada langkah sebelumnya yang berhasil. Karena saya membatasi diri ke API eksternal, saya tidak bisa begitu saja memasukkan nilai ke dalam basis data.
Jadi, entah saya punya satu metode pengujian yang sangat panjang yang tidak `A; menegaskan; B; menegaskan; C; menegaskan ... ", atau saya memecahnya menjadi metode pengujian terpisah, di mana setiap metode pengujian membutuhkan hasil pengujian sebelumnya sebelum dapat melakukan hal tersebut:
def testAccountSignup():
# etc.
return email, password
def testAuthToken():
email, password = testAccountSignup()
token = get_auth_token(email, password)
assert token
return token
def testA():
token = testAuthToken()
a = do_A(token)
# etc.
Saya pikir ini baunya. Apakah ada cara yang lebih baik untuk menulis tes ini?
Saya akan memisahkan kode pengujian dari kode pengaturan. Mungkin:
Ingat, semua informasi acak yang dihasilkan harus dimasukkan dalam pernyataan jika gagal, jika tidak pengujian Anda mungkin tidak dapat direproduksi. Saya bahkan mungkin merekam benih acak yang digunakan. Setiap kali kasus acak gagal, tambahkan input spesifik sebagai tes hard-code untuk mencegah regresi.
sumber
Tidak jauh lebih baik, tetapi Anda setidaknya dapat memisahkan kode pengaturan dari kode menegaskan. Tulis metode terpisah yang menceritakan keseluruhan cerita selangkah demi selangkah, dan ambil parameter yang mengontrol berapa langkah yang harus diambil. Kemudian setiap tes dapat mengatakan sesuatu seperti
simulate 4
atausimulate 10
dan kemudian menegaskan apa pun yang diuji.sumber
Yah, saya mungkin tidak mendapatkan sintaks Python di sini dengan "air coding", tapi saya kira Anda mendapatkan ide: Anda dapat mengimplementasikan fungsi umum seperti ini:
yang akan memungkinkan Anda untuk menulis tes Anda seperti ini:
Tentu saja, masih bisa diperdebatkan jika hilangnya keterbacaan dari pendekatan ini layak untuk digunakan, tetapi itu mengurangi kode boilerplate sedikit.
sumber