比方说,我有一个接受用户名和密码的功能,它就从数据库中检索记录,并对这些数据进行以下检查编写测试失败的单元测试?
- 今天的日期是一个日期范围
- 用户是外禁用
- 的参数比较时
如果任何这些条件为真则抛出异常。
很显然,我想要写我的单元测试,以测试他的逻辑,但是如果我做了一个会抛出异常,我的测试将失败,这是不正确的 - 是什么呢?
比方说,我有一个接受用户名和密码的功能,它就从数据库中检索记录,并对这些数据进行以下检查编写测试失败的单元测试?
如果任何这些条件为真则抛出异常。
很显然,我想要写我的单元测试,以测试他的逻辑,但是如果我做了一个会抛出异常,我的测试将失败,这是不正确的 - 是什么呢?
是的,你的测试将正确地抛出一个异常,但在大多数(全部?)测试框架,您可以指定预期的异常,测试会通过。
在MSTest的和NUnit
[ExpectedException(typeof(ArgumentException))]
只是要小心其中可能抛出异常的情况下,但对于那些比你预期等原因。
既然你没有说你正在使用哪个测试框架,我不能进入具体细节,但是框架将允许你将测试标记为期望异常。当抛出异常时,这将停止测试失败,并允许您检查异常本身的类型和内容。另一方面,如果您使用的框架不支持这个功能(尽管我不认为有任何不支持),您可以在测试中手动添加try ... catch块,以便异常不会传播出去并导致测试失败。
我不知道我在这里看到问题。有合同主叫方和被叫方和,该合同是否涉及异常之间被抛出,或错误返回码(例如,如果将例外被叫内捕获并转换成返回代码),你只需要检查问题是否以某种方式发出信号。
例如,如果你的合同规定的getDbRow()
将抛出DbNotOpenException
如果数据库未打开,这样做:
db.Close()
try:
x = db.getDbRow()
catch DbNotOpenException e:
return PASSED_TEST
return FAILED_TEST
换句话说,如果你的单元测试期望为给定的特定异常情况下,他们应该陷入困境并报告说没问题。如果发生异常不发生,他们应该标记失败。
+1 - 正是你应该做的。大多数单元测试框架允许您继续前进,并且如果不抛出期望的异常,将会失败。单元测试不仅应该测试那些功能在给定条件成功时工作,而且在没有这些条件的情况下适当地失败。 – 2010-05-17 09:16:01