Questions tagged «unit-testing»

单元测试是一种测试源代码的各个单元以确定它们是否适合使用的方法。

10
如何测试测试?
我们测试代码以使其更正确(实际上,不正确的可能性较小)。但是,测试也是代码-它们也可能包含错误。而且,如果您的测试有错误,则很难使您的代码变得更好。 我可以想到测试中三种可能的错误类型: 逻辑错误,当程序员误解了手头的任务,并且测试按照他认为应该做的事情进行时,这是错误的; 基础测试框架中的错误(例如,泄漏的模拟抽象); 测试中的错误:测试的执行与程序员认为的稍有不同。 类型(1)错误似乎无法防止(除非程序员只是……变得更聪明)。但是,(2)和(3)可能很容易处理。您如何处理这些类型的错误?您有什么特殊策略可以避免它们吗?例如,您是否编写了一些特殊的“空”测试,仅检查测试作者的预设?此外,您如何调试已损坏的测试用例?

12
如果您的单元测试代码“闻起来”真的有关系吗?
通常,我只是使用复制和粘贴以及所有其他不良做法将单元测试放在一起。单元测试通常看起来很难看,充满了“代码味道”,但这真的重要吗?只要“真实”代码是“良好”,我总是告诉自己,这很重要。另外,单元测试通常需要诸如存根函数之类的各种“臭味”。 我应该如何应对设计不佳(“臭”)的单元测试?

3
断言或单元测试更重要吗?
断言测试和单元测试都充当代码库的文档,并且是发现错误的一种手段。主要区别在于,断言充当健全性检查并查看实际输入,而单元测试则在特定的模拟输入上运行,并且是针对单个明确定义的“正确答案”的测试。使用断言与单元测试作为验证正确性的主要方法有哪些相对优点?您认为应该重点强调哪个?


6
单元测试是否应该存储在存储库中?
我是一个成长中的程序员,他最终将我存储在GitHub上的库的单元测试付诸实践。 在我看来,我可能会在测试库中包含测试套件,但是当我环顾其他项目时,包含测试似乎是命中注定的。 这是不好的形式吗?是不是用户只对工作代码感兴趣,是否仍将在自己的框架中进行测试?

11
自动化测试的缺点是什么?
这个站点上有许多问题,可以提供有关自动测试可以带来的好处的大量信息。但是我没有看到代表硬币另一面的东西:缺点是什么?生活中的所有事情都是折衷方案,没有万灵药,因此,一定有一些正当理由不进行自动化测试。这些是什么? 以下是我提出的一些建议: 给定功能需要更多的初始开发时间 需要团队成员更高的技能水平 增加工具需求(测试执行者,框架等) 遇到失败的测试时,需要进行复杂的分析-该测试是由于我的更改而过时还是在告诉我我做错了? 编辑 我应该说我是自动化测试的坚定支持者,并且我不希望这样做。我想了解缺点是什么,所以当我去公司提出理由时,我看起来好像并没有扔下一个想象中的银弹。 另外,我明确地是不希望有人对我的上述示例提出异议。我确实认为必须存在一些不利因素(所有因素都需要权衡),我想了解它们是什么。

9
单元测试或测试驱动的开发值得吗?
我的工作团队正在迁移到Scrum,其他团队也开始使用单元测试和用户接受测试来进行测试驱动的开发。我喜欢UAT,但是对于测试驱动的开发或通常测试驱动的开发,我不出售单元测试。 看来编写测试是一项额外的工作,使人们在编写实际代码时显得cr不休,而且可能并不经常有效。 我了解单元测试如何工作以及如何编写它们,但是任何人都可以证明这确实是一个好主意,值得付出时间和精力吗? 另外,还有什么使TDD特别适合Scrum的?

5
如果我已经有集成测试,是否需要单元测试?
如果我已经对我的程序进行了集成测试,并且都通过了测试,那么我有很好的感觉,它可以工作。那么编写/添加单元测试的原因是什么?由于无论如何我都必须编写集成测试,所以我只想为集成测试未涵盖的部分编写单元测试。 我知道单元测试优于集成测试的好处是 体积小,因此运行速度快(但是,通过集成测试已经测试了添加新单元以测试某件东西,这意味着我的总体测试服变得越来越大,并且运行时间更长) 由于只测试一件事,因此更容易找到错误(但是,当我的集成测试失败时,我可以开始编写单元测试来验证每个单独的部分) 查找集成测试中可能未捕获的错误。例如掩盖/抵消错误。(但是,如果我的集成测试通过了所有测试,这意味着即使存在一些隐藏的错误,我的程序也可以运行。因此,找到/修复这些错误并不是真正的高优先级,除非它们开始破坏未来的集成测试或引起性能问题) 而且,我们总是希望编写更少的代码,但是编写单元测试需要更多的代码(主要是安装模拟对象)。我的一些单元测试和集成测试之间的区别在于,在单元测试中,我使用模拟对象,而在集成测试中,我使用真实对象。其中有很多重复项,即使在测试中,我也不喜欢重复的代码,因为这会增加更改代码行为的开销(重构工具无法始终保持所有工作)。

2
如何组织C ++单元测试代码以实现最大的单元测试效率?
这个问题与单元测试框架无关。 这个问题与编写单元测试无关。 这个问题是关于在哪里放置UT代码以及如何/何时/在哪里编译和运行它。 在有效地使用旧版代码中,迈克尔·费瑟斯断言 良好的单元测试...运行速度快 然后 运行1/10秒的单元测试是缓慢的单元测试。 我认为这些定义确实有意义。我还认为,这意味着您必须分别保留一组单元测试和一组代码测试,这些测试需要更长的时间,但是我想这就是您仅在运行(非常快)时才调用单元测试的价格。 显然,问题在C ++中是“跑”单元测试(小号),你必须: 编辑代码(生产或单元测试,具体取决于您所在的“周期”) 编译 链接 启动单元测试可执行文件(小号) 编辑(经过奇怪的近距离表决):在进入细节之前,我将尝试在此处总结要点: 如何有效地组织C ++单元测试代码,这样既可以有效地编辑(测试)代码又可以运行测试代码? 然后,第一个问题是确定将单元测试代码放在哪里,以便: 结合相关的生产代码进行编辑和查看是“自然的”。 轻松/快速地为您当前更改的单元开始编译周期 在第二个的话,相关的,问题是什么来编译,这样的反馈是瞬时的。 极端的选择: 每个单元测试-测试单元都位于一个单独的cpp文件中,并且此cpp文件被单独编译+链接(连同它测试的源代码单元文件)到单个可执行文件,然后该可执行文件运行此一个单元测试。 (+)这样可以最小化单个测试单元的启动(编译+链接!)时间。 (+)测试运行非常快,因为它仅测试一个单元。 (-)执行整个套件将需要启动大量流程。可能是一个管理难题。 (-)流程启动的开销将变得可见 另一面将是-仍然-每个测试一个cpp文件,但是所有测试cpp文件(以及它们测试的代码!)都链接到一个可执行文件中(每个模块/每个项目/选择您的选择)。 (+)编译时间仍然可以,因为只有更改的代码才能编译。 (+)执行整个套件很容易,因为只有一个exe可以运行。 (-)套件将花费很多时间进行链接,因为任何对象的每次重新编译都会触发重新链接。 (-)(?)套装将花费更长的时间运行,尽管如果所有单元测试都很快,则时间应该可以。 那么,现实世界中的C ++ 单元测试如何处理?如果我只是每晚/每小时运行一次,那么第二部分并不重要,但是第一部分,即如何将UT代码“耦合”到生产代码,这样对于开发人员来说,将两者保持一致是“自然的”我认为专注始终很重要。(如果开发人员将UT代码作为重点,他们将要运行它,这将使我们回到第二部分。) 欣赏真实世界的故事和经验! 笔记: 该问题有意离开了未指定的平台和品牌/项目系统。 问题带有标记的UT&C ++是一个很好的起点,但是不幸的是,太多的问题(尤其是答案)过于注重细节或特定框架。 前一阵子,我回答了关于升压单元测试的结构的类似问题。我发现这种结构对于“真实的”快速单元测试是缺少的。我发现另一个问题过于狭窄,因此提出了这个新问题。

4
确定什么是有用的单元测试
我一直在研究phpunit的文档,并遇到以下引号: 您可以随时编写更多测试。但是,您会很快发现,您可以想象的测试中只有一小部分确实有用。您要编写的测试即使您认为应该可以通过也要失败,或者编写的测试即使您认为应该可以通过也要成功。另一种思考的方式是成本/收益。您想编写测试以回馈信息。-埃里希·伽玛(Erich Gamma) 我很纳闷。除了该报价中关于成本/收益的内容外,如何确定使单元测试比其他单元更有用的因素。您如何决定为哪个代码创建单元测试?我之所以这么问,是因为其中的另一句话也说: 因此,如果不是关于测试,那是关于什么的?这是要弄清楚您要做什么,然后再半弯腰去尝试。您编写了一个规范,以简洁,明确和可执行的形式细化了行为的一小部分。就这么简单。这是否意味着您编写测试?不,这意味着您编写代码说明。这意味着您需要提前指定代码的行为。但时间不算早。实际上,在编写代码之前最好是最好的方法,因为那时候您掌握的信息将尽可能多。就像做得好的TDD一样,您以微小的增量工作……一次指定行为的一个小方面,然后加以实现。当您意识到这全都在于指定行为而不是编写测试时,您的观点发生了变化。突然,为您的每个生产类都提供一个Test类的想法是非常荒谬的。用自己的测试方法(以1-1关系)测试每种方法的想法将是可笑的。-戴夫·阿斯特斯 重要的部分是 * 并且用自己的测试方法(以1-1关系)测试每种方法的想法将是可笑的。* 因此,如果为每个方法创建测试都是“可笑的”,那么您如何/何时选择编写测试的目的?

7
嵌入式开发的单元测试时的最佳实践
我正在寻找一些针对嵌入式系统编写的单元测试代码的最佳实践策略。对于嵌入式系统,我的意思是代码,例如设备驱动程序,ISR处理程序等,它们与金属非常接近。 如果不借助ICE在硬件上进行测试,则无法进行大多数单元测试。有时,嵌入式单元还需要与其他刺激因素挂钩,例如机械开关,步进电机和灯泡。这通常以手动方式发生,自动化虽然很棒,但实现起来却又困难又昂贵。 更新资料 我遇到了一个C测试框架,该框架似乎在测试嵌入式项目中非常成功。它使用了模拟硬件的想法。查看Unity,CMock以及可能的Ceedling。 更新2016年7月6日 跨过cmocka-似乎正在更加积极地开展工作。

5
您如何说服管理层“投资”单元测试?
您如何说服经理让您进行单元测试? “使用”是指被允许开发,检入源代码控制并随着时间的推移维护单元测试等。 典型的管理异议是: 客户没有为单元测试付费 该项目没有时间进行单元测试 技术债务?什么技术债务? 您知道其他异议吗?你的答案是什么? 提前致谢!

10
单元测试如何促进设计?
我们的同事提倡编写单元测试,因为它实际上是在帮助我们改进设计和重构事物,但我不知道如何做。如果我正在加载CSV文件并进行解析,那么单元测试(验证字段中的值)将如何帮助我验证设计?他提到了耦合和模块化等问题,但是对我而言,这没有多大意义-但我的理论背景并不多。 这与您标记为重复的问题不同,我将对实际示例如何起到帮助作用感兴趣,而不仅仅是理论上说“有帮助”。我喜欢下面的答案和评论,但我想了解更多。

14
固有随机/非确定性算法的单元测试
简而言之,我当前的项目涉及“约束随机事件”的创建。我基本上是在制定检查时间表。其中一些是基于严格的计划约束;您每周星期五10:00 AM进行一次检查。其他检查是“随机的”;有一些基本的可配置要求,例如“每周必须进行3次检查”,“必须在9 AM-9PM的时间之间进行检查”以及“在同一8小时内不应进行两次检查”,但是在为一组特定的检查配置的任何限制内,得出的日期和时间均不可预测。 单元测试和TDD,IMO在此系统中具有巨大的价值,因为它们可以用于按增量方式构建它,而整套需求仍然不完整,并确保我不会“过度设计”它来做我不喜欢的事情目前不知道我需要。严格的时间表对TDD来说是小菜一碟。但是,当我为系统的随机部分编写测试时,我发现很难真正定义要测试的内容。我可以断言调度程序产生的所有时间都必须在约束范围内,但是我可以实现通过所有此类测试的算法,而实际时间却不是很“随机”。实际上,这正是发生的事情。我发现了一个问题,尽管时间无法精确预测,但它属于允许的日期/时间范围的一小部分。该算法仍然通过了我认为我可以合理做出的所有断言,并且我无法设计在这种情况下会失败的自动测试,但是在给出“更​​多随机”结果时通过。我必须证明该问题是通过重组一些现有测试以重复多次来解决的,并目视检查生成的时间是否在整个允许范围内。 有没有人提供设计非预期行为的提示? 感谢所有的建议。主要观点似乎是,我需要进行确定性测试才能获得确定性,可重复性和可肯定的结果。说得通。 我创建了一组“沙盒”测试,其中包含用于约束过程(可能为任意长的字节数组在最小值和最大值之间变长的过程)的候选算法。然后,我通过一个FOR循环运行该代码,该循环为该算法提供了几个已知的字节数组(刚开始时从1到10,000,000的值),并使该算法将每个值限制为1009到7919之间的值(我使用质数来确保算法不会在输入和输出范围之间经过一些偶然的GCF)。计算得到的约束值,并生成直方图。要“通过”,所有输入都必须反映在直方图中(为了确保我们不会“丢失”任何值),直方图中任意两个存储桶之间的差不能大于2(实际上应小于等于1) ,但请继续关注)。获胜的算法(如果有)可以直接剪切并粘贴到生产代码中,并进行永久测试以进行回归。 这是代码: private void TestConstraintAlgorithm(int min, int max, Func<byte[], long, long, long> constraintAlgorithm) { var histogram = new int[max-min+1]; for (int i = 1; i <= 10000000; i++) { //This is the stand-in for the PRNG; produces a known byte array var buffer …

9
在进行TDD时需要记录日志吗?
在进行红色,绿色和重构循环时,我们应始终编写最少的代码以通过测试。这就是我被教导有关TDD的方式,以及几乎所有书籍都描述该过程的方式。 但是日志记录呢? 老实说,除非发生真正复杂的事情,否则我很少在应用程序中使用日志记录,但是,我看到无数篇文章都谈到了正确日志记录的重要性。 因此,除了记录异常外,我无法证明在适当的经过测试的应用程序(单元/集成/验收测试)中记录日志的真正重要性。 所以我的问题是: 如果正在执行TDD,是否需要记录?失败的测试不会揭示应用程序有什么问题吗? 是否应该在每个类的每个方法中为日志记录过程添加测试? 例如,如果在生产环境中禁用了某些日志级别,这是否会在测试和环境之间引入依赖性? 人们谈论日志如何简化调试,但是TDD的主要优点之一是,我始终知道由于测试失败而出了什么问题。 有什么我想念的吗?

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.