ฉันเริ่มใช้ common test
เป็นกรอบการทดสอบของฉันใน erlang
สมมติว่าฉันมีฟังก์ชันที่ฉันคาดว่าจะยอมรับเฉพาะจำนวนบวก และควรจะพัดในกรณีอื่น
positive_number(X) when > 0 -> {positive, X}.
และฉันต้องการทดสอบสิ่งนั้น
positive_number(-5).
จะไม่สำเร็จลุล่วงได้
ฉันจะทดสอบพฤติกรรมนี้ได้อย่างไร ในภาษาอื่น ฉันจะบอกว่ากรณีทดสอบคาดว่าจะมีข้อผิดพลาดหรือข้อยกเว้น และล้มเหลวหากทำงานภายใต้การทดสอบไม่แสดงข้อผิดพลาดใดๆ สำหรับพารามิเตอร์ที่ไม่ถูกต้องที่ไม่ถูกต้อง จะทำอย่างไรกับการทดสอบทั่วไป?
อัปเดต:
ฉันสามารถทำให้มันใช้งานได้
test_credit_invalid_input(_) ->
InvalidArgument = -1,
try mypackage:positive_number(InvalidArgument) of
_ -> ct:fail(not_failing_as_expected)
catch
error:function_clause -> ok
end.
แต่ฉันคิดว่านี่มันละเอียดเกินไป ฉันต้องการบางอย่างเช่น:
assert_error(mypackage:positive_number, [-1], error:function_clause)
ฉันคิดว่าการทดสอบทั่วไปมีสิ่งนี้ในบางแห่งและฉันขาดความรู้ที่ถูกต้องเกี่ยวกับกรอบการทำงานที่ทำให้ฉันต้องใช้วิธีการแก้ปัญหาแบบละเอียด
อัปเดต: ได้รับแรงบันดาลใจจากคำตอบของ Michael ฉันจึงสร้างฟังก์ชันต่อไปนี้:
assert_fail(Fun, Args, ExceptionType, ExceptionValue, Reason) ->
try apply(Fun, Args) of
_ -> ct:fail(Reason)
catch
ExceptionType:ExceptionValue -> ok
end.
และการทดสอบของฉันก็กลายเป็น:
test_credit_invalid_input(_) ->
InvalidArgument = -1,
assert_fail(fun mypackage:positive_number/1,
[InvalidArgument],
error,
function_clause,
failed_to_catch_invalid_argument).
แต่ฉันคิดว่ามันใช้งานได้เพราะมันอ่านง่ายขึ้นเล็กน้อยที่จะมีการเรียก assert_fail
มากกว่าการมี try....catch
ในทุกกรณีทดสอบ
ฉันยังคงคิดว่าควรมีการใช้งานที่ดีกว่านี้ใน Common Test, IMO เป็นการทำซ้ำที่น่าเกลียดที่จะมีการนำรูปแบบการทดสอบนี้ไปใช้ซ้ำๆ ในทุกโครงการ