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 は、このテスト パターンをすべてのプロジェクトで繰り返し実装するのは醜い繰り返しです。