|
|
1
37
这是一个完全正确的问题。 首先,很多人认为你的断言是错误的。我想很多调试专家会不同意。虽然用断言检查不变量是一个好的实践,但是断言不应该局限于状态不变量。事实上,除了检查不变量外,许多专家调试器会告诉您断言任何可能导致异常的条件。 例如,请考虑以下代码:
没关系。但是,当抛出异常时,堆栈将被解除绑定,直到有人处理异常(可能是某个顶级默认处理程序)。如果执行暂停在那一点(你可能在Windows应用程序中有一个模式异常对话框),你有机会附加一个调试器,但是你可能已经丢失了很多本来可以帮助你解决这个问题的信息,因为大多数堆栈都已解除。 现在考虑一下:
现在,如果出现问题,就会弹出模态断言对话框。执行立即暂停。您可以自由地附加所选的调试器,并精确地调查堆栈上的内容以及系统在确切故障点的所有状态。在发布版本中,仍然会有一个异常。 现在我们如何处理您的单元测试? 考虑一个单元测试,它测试上面包含断言的代码。要检查当param1为空时是否引发异常。您希望该特定断言失败,但任何其他断言失败都将表明有问题。您希望允许特定测试的特定断言失败。 你解决这个问题的方法将取决于你使用的语言等。但是,如果您使用.NET,我有一些建议(我实际上还没有尝试过,但我以后会更新帖子):
例如,一个TraceListener包含了执行类似堆栈遍历的代码,我将搜索supersert.NET的supersertListener并检查其代码。(如果您对使用断言进行调试非常认真,那么集成SUPERASSERT.NET也是值得的)。 大多数单元测试框架都支持测试设置/拆卸方法。您可能需要添加代码来重置跟踪侦听器,并断言在这些区域中没有任何意外的断言失败,以最小化重复并防止错误。 更新: 下面是一个可以用于单元测试断言的TraceListener示例。您应该向Trace.Listeners集合添加一个实例。您可能还想提供一些简单的方法,让您的测试能够抓住监听器。 注:这要归功于John Robbins的supersert.NET。
您可以在每个测试开始时将断言添加到AllowedFailures集合中,以获得您期望的断言。 在每个测试结束时(希望您的单元测试框架支持一个测试分解方法)执行以下操作:
|
|
|
2
13
IMHO debug.asserts摇滚。这个 great article 演示如何通过将app.config添加到单元测试项目并禁用对话框来阻止它们中断单元测试:
|
|
3
7
您的代码中的断言是(应该是)对读者说“这个条件在这一点上应该总是正确的”的语句。通过一些规则,它们可以成为确保代码正确的一部分;大多数人将它们用作调试打印语句。单元测试是 演示 您的代码正确地执行了一个特定的测试用例;当然,它们可以同时记录需求,并提高您对代码确实正确的信心。 明白区别了吗?程序断言可以帮助您纠正错误,单元测试可以帮助您建立其他人对代码正确的信心。 |
|
|
4
7
正如其他人所提到的,调试断言意味着 应该永远是真的 . (这个词的意思是 不变性 ). 如果您的单元测试传递的是使断言失败的虚假数据,那么您必须问自己一个问题-为什么会发生这种情况?
第二点是相当多的开发人员似乎陷入了困境。单元测试检查您的代码要处理的所有事情,并断言或抛出其他所有事情的异常-毕竟,如果您的代码不是为处理这些情况而构建的,并且您导致了这些情况的发生,您希望发生什么?
更新以澄清:另一方面,你最终意识到你只应该使用
|
|
|
5
2
一个好的单元测试设置将能够捕获断言。如果触发断言,则当前测试应失败,并运行下一个测试。 在我们的库中,低级调试功能(如TTY/ASSERTS)具有调用的处理程序。默认处理程序将打印f/break,但客户端代码可以为不同的行为安装自定义处理程序。 我们的UnitTest框架安装了自己的处理程序,用于记录消息并对断言抛出异常。然后,UnitTest代码将捕获这些异常(如果发生),并将它们与断言的语句一起记录为失败。 您还可以在单元测试中包括断言测试-例如。 CHECK_ASSERT(someList.getAt(someList.size()+1);//ASSERT发生时测试通过 |
|
|
6
1
您是指“通过契约编程”的断言,还是CPPUnit/JUnit断言的C++/Java断言?最后一个问题让我相信是前者。 有趣的问题,因为据我所知,当您部署到生产环境时,这些断言通常在运行时关闭。(这有点违背目的,但那是另一个问题。) 我认为在测试代码时应该将它们留在代码中。您编写测试以确保适当地实施这些前提条件。测试应该是一个“黑盒”;测试时您应该充当类的客户机。如果您碰巧在生产中关闭了它们,它不会使测试无效。 |
|
|
7
1
首先要有两个按合同设计的断言 和 单元测试,您的单元测试框架应该能够捕获断言。如果您的单元测试由于DbC中止而中止,那么您就不能运行它们。这里的替代方法是在运行(读编译)单元测试时禁用这些断言。 既然您正在测试非公共函数,那么使用无效参数调用函数的风险是什么?你的单元测试不包括这个风险吗?如果您按照TDD(测试驱动开发)技术编写代码,他们应该这样做。 如果您真的希望/需要代码中的那些Dbc类型断言,那么可以删除将无效参数传递给具有这些断言的方法的单元测试。 但是,当您有粗粒度的单元测试时,Dbc类型断言在较低级别的函数(单元测试不直接调用)中可能很有用。 |
|
|
8
1
即使单元测试已经就绪,也应该保留调试断言。 这里的问题不是区分错误和问题。 如果函数检查错误的参数,则不应导致调试断言。相反,它应该返回一个错误值。用错误的参数调用函数是错误的。 如果传递给函数的数据正确,但由于运行时内存不足而无法正常运行,则代码应为此问题发出调试断言。这是一个基本假设的例子,如果它们不成立,“所有的赌注都结束了”,所以你必须终止。 在您的情况下,请编写单元测试,以提供错误的值作为参数。它应该期望一个错误返回值(或类似的值)。得到一个断言?--重构代码以产生错误。 注意,无缺陷问题仍然会触发断言;例如,硬件可能会损坏。在您的问题中,您提到了集成测试;事实上,断言不正确组合的集成系统是断言领域;例如,加载了不兼容的库版本。 注意,“debug”断言的原因是勤奋/安全和快速/小型之间的权衡。 |
|
|
9
0
就像其他人提到的那样
你不应该测试这个(可能也不想,因为你真的无能为力!) 我可能有点离题,但我的印象是,也许你所说的断言更适合作为“论点例外”,例如。
代码中的那种“断言”仍然是可以测试的。 主键:-) |
|
|
10
0
问这个问题已经有一段时间了,但是我想我有一种不同的方法来验证来自使用C代码的单元测试中的Debug.Assert()调用。注意
UnitTestTraceListener类如下所示:
|
|
|
11
0
不,恰恰相反。单元测试通过在运行您编写的白盒测试时对内部状态进行双重检查,使调试断言更有价值。在单元测试期间启用Debug.Assert非常重要,因为很少发布启用调试的代码(除非性能根本不重要)。调试代码只有两次是在以下情况下运行的:1)进行真正的集成测试(除了良好的意图外),2)运行单元测试。 使用Debug.Assert测试检查不变量很容易。当单元测试运行时,这些检查充当健全性检查。 Assert所做的其他事情是指向代码中出错的第一个点。这可以大大减少单元测试时的调试时间 做 找出问题所在。 这会增加单元测试的值。
恰到好处。这个问题是关于真实发生的事情。正确的?因此,您需要在代码中使用调试断言,并且需要在单元测试期间触发它们。调试断言可能在单元测试期间触发的可能性清楚地表明,调试断言应该在单元测试期间启用。 断言触发意味着要么您的测试不正确地使用了您的内部代码(并且应该被修复),要么测试中的某些代码不正确地调用了其他内部代码,或者某个基本假设是错误的。你不写测试,因为你认为你的假设是错误的,你。。。事实上,你知道。你写测试是因为至少你的一些假设可能是错误的。在这种情况下冗余是可以的。
冗余只会影响单元测试的运行时间。如果你 真正地 有100%的覆盖率,运行时可能是一个问题。否则,我强烈反对。在测试过程中自动检查假设没有错。这实际上就是“测试”的定义。
通常,单元测试框架的目的并不是在违背不变假设的情况下测试代码的行为。换言之,如果您编写的文档中说“如果将null作为参数传递,则结果未定义”,则无需验证结果是否确实不可预测。如果故障结果定义得很清楚,那么它们就不是未定义的,并且1)它不应该是Debug.Assert,2)您应该确切地定义结果是什么,以及3)测试结果。如果您需要对内部调试断言的质量进行单元测试,那么1)Andrew Grant将断言框架作为可测试资产的方法可能应该作为答案进行检查,2)哇,您的测试覆盖率真棒!我认为这很大程度上是基于项目需求的个人决定。但我仍然认为调试断言是必要的和有价值的。 换句话说:Debug.Assert()大大增加了单元测试的值,冗余是一个特性。 |
|
|
wavesinaroom · 断言结构向量长度 11 月前 |
|
|
Jace Johnson · Typescript文件读取的变量类型错误 11 月前 |
|
|
Tim Kirkwood · 比较空数据帧 12 月前 |
|
Kamran Khan · 使用单元测试ASP。NET核心 1 年前 |
|
|
paymer · 为什么我的代码没有删除我的单元测试生成的zip文件? 1 年前 |
|
|
Ricky Mo · 角度测试如何模拟导入的const 1 年前 |
|
|
Natty · Visual Studio中缺少“代码覆盖率结果” 1 年前 |