How to call a function if unit test fails?

5 ビュー (過去 30 日間)
John Doe
John Doe 2020 年 1 月 30 日
コメント済み: John Doe 2020 年 1 月 30 日
If this is possible in a script unit test, that would be great. I want to do the following:
%% Unit test
a = 1;
b = 2;
fail = assert(a == b)
if fail
fail_function;
end
fuction fail_function
disp('Test failed');
end
I've also tried finding something to do this using class-based unit testing, but I haven't found anything. Thank you.
  1 件のコメント
Walter Roberson
Walter Roberson 2020 年 1 月 30 日
assert() does not permit output assignment.

サインインしてコメントする。

採用された回答

Andy Campbell
Andy Campbell 2020 年 1 月 30 日
編集済み: Andy Campbell 2020 年 1 月 30 日
Hi there,
If you really want to stay in a script based test, the best way to do this would to be to use a try-catch
%% Unit test
a = 1;
b = 2;
try
assert(a == b)
catch ex
fail_function;
rethrow(ex);
end
function fail_function
disp('Test failed');
end
However, I think that you can do something pretty cleanly using function based tests, which might be more approachable for your use case than classes, but has a bit of extra nice-ness. In this case you can just pass the function handle to what you want to do as a diagnostic argument to the verification function:
function tests = my_test
tests = functiontests(localfunctions);
end
function testMyCode(testCase)
%% Unit test
a = 1;
b = 2;
verifyEqual(testCase, a, b, @fail_function)
end
function fail_function
disp('Test failed');
end
Note that you also get access to verifyEqual and many other functions for qualification. In the case of verifyEqual vs assert(a==b), verifyEqual actually provides a lot of testing specific strictness and better diagnostics when things fail. It should handle edge cases for you.
  1 件のコメント
John Doe
John Doe 2020 年 1 月 30 日
Thanks Andy, both these solutions work well for me and I appreciate being provided with alternatives. I had overlooked a function based test, but it does look like a solid compromise between scripts/classes. Thank you!

サインインしてコメントする。

その他の回答 (1 件)

Steven Lord
Steven Lord 2020 年 1 月 30 日
編集済み: Steven Lord 2020 年 1 月 30 日
If all you want your function to do is display a diagnostic message, just modify your call to assert slightly.
%% Unit test
a = 1;
b = 2;
assert(a == b, 'Test failed')
If you want your function to do something else there may be a way to do what you want. One possibility would be to use the diagnostic input to the qualification functions/methods. But it would be difficult to give a more informative answer without more information about what you want to do.
[Forgot assert can't have an output argument when I copied and pasted the example. Removing the output.]
  1 件のコメント
John Doe
John Doe 2020 年 1 月 30 日
Thank you, I did want to actually run a function, but I appreciate the response and the information on the assert function!

サインインしてコメントする。

カテゴリ

Help Center および File ExchangeTesting Frameworks についてさらに検索

タグ

製品


リリース

R2017a

Translated by