Saya mulai menggunakan common test
sebagai kerangka pengujian saya di erlang.
Misalkan saya memiliki fungsi yang saya harapkan hanya menerima bilangan positif dan fungsi tersebut akan hilang jika tidak.
positive_number(X) when > 0 -> {positive, X}.
dan saya ingin mengujinya
positive_number(-5).
tidak akan berhasil diselesaikan.
Bagaimana cara menguji perilaku ini? Dalam bahasa lain saya akan mengatakan bahwa kasus uji mengharapkan beberapa kesalahan atau pengecualian dan gagal jika fungsinya dalam pengujian tidak menimbulkan kesalahan apa pun karena parameter tidak valid yang tidak valid. Bagaimana cara melakukannya dengan tes umum?
Pembaruan:
Saya bisa membuatnya berfungsi
test_credit_invalid_input(_) ->
InvalidArgument = -1,
try mypackage:positive_number(InvalidArgument) of
_ -> ct:fail(not_failing_as_expected)
catch
error:function_clause -> ok
end.
tapi menurut saya ini terlalu bertele-tele, saya ingin sesuatu seperti:
assert_error(mypackage:positive_number, [-1], error:function_clause)
Saya berasumsi bahwa tes umum memiliki hal ini di beberapa tempat dan kurangnya pengetahuan saya tentang kerangka kerja yang membuat saya mengambil solusi yang bertele-tele.
Pembaruan: Terinspirasi oleh respons Michael, saya membuat fungsi berikut:
assert_fail(Fun, Args, ExceptionType, ExceptionValue, Reason) ->
try apply(Fun, Args) of
_ -> ct:fail(Reason)
catch
ExceptionType:ExceptionValue -> ok
end.
dan tes saya menjadi:
test_credit_invalid_input(_) ->
InvalidArgument = -1,
assert_fail(fun mypackage:positive_number/1,
[InvalidArgument],
error,
function_clause,
failed_to_catch_invalid_argument).
tapi menurut saya ini berhasil karena panggilan assert_fail
sedikit lebih mudah dibaca daripada panggilan try....catch
di setiap kasus uji.
Saya masih berpikir bahwa beberapa implementasi yang lebih baik harus ada di Common Test, IMO merupakan pengulangan yang buruk jika pola pengujian ini diterapkan berulang kali di setiap proyek.