Questions tagged «unit-testing»

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

3
单元测试行为,无需耦合到实现细节
Ian Cooper 在他的演讲TDD中,哪里都出错了,将Kent Beck的初衷推到了TDD中的单元测试(测试行为,而不是具体的类方法),并主张避免将测试与实现耦合。 对于行为,例如save X to some data source在具有一组典型的服务和存储库的系统中,我们如何通过存储库对服务级别的某些数据的保存进行单元测试,而又不将测试与实现细节耦合(例如调用特定方法) )?避免这种耦合实际上不值得付出某种努力/坏处吗?

9
是否应该使用单元测试来测试枚举的值?
如果您有一个仅带有值的枚举(没有任何方法可以像Java中那样),并且此枚举是系统业务定义的一部分,那么应该为它编写单元测试吗? 我一直认为应该编写它们,即使它们看起来很简单而且很多余,但我认为应该在测试中明确编写与业务规范有关的内容,无论它是使用unit / integration / ui / etc编写的。测试或使用语言的类型系统作为测试方法。因为从业务的角度来看,枚举(例如Java中)必须具有的值不能使用类型系统进行测试,所以我认为应该为此进行单元测试。 这个问题是不是类似于这一个,因为它没有解决同样的问题我的。在该问题中,存在一个业务功能(savePeople),而该人员正在查询内部实现(forEach)。在那里,有一个中间业务层(该功能可节省人员),封装了语言构造(forEach)。这里的语言构造(枚举)是用于从业务角度指定行为的一种。 在这种情况下,实现细节与数据的“真实性质”相吻合,即:(在数学意义上)一组值。您可以说使用了一个不可变的集合,但是相同的值仍然应该在那里存在。如果使用数组,则必须执行相同的操作来测试业务逻辑。我认为这里的难题在于,语言结构与数据的性质非常吻合。我不确定我是否正确解释了自己

2
可以避免测试基类吗?
我有一个带有大量“元编程”的基类,以使其具有相当通用的灵活性/抽象性。 在基类中,我确实有很多使用通用方法的子类,并且有面向行为的单元测试,涵盖了每个子类中的所有情况。 可以跳过基类测试吗?

4
编写作为另一个测试的子集的单元测试是否有任何价值?
举一个稍微做作的例子,假设我要测试一个函数返回两个数字,并且第一个小于第二个: def test_length(): result = my_function() assert len(result) == 2 def test_order() a, b = my_function() assert a < b 在这里,如果test_length失败,那么test_order也会失败。编写test_length或跳过是一种最佳实践吗? 编辑:请注意,在这种情况下,两个测试大多彼此独立,每个测试可以独立运行,也可以以相反的顺序运行,这无关紧要。所以这些以前的问题都没有 我应该如何测试在其中使用其他功能的功能的功能? 如果我已经有集成测试,是否需要单元测试? 如何在一个测试是另一测试的设置的地方构造测试? 如何管理单元测试之间的成功依赖关系 与上述内容重复。

4
如何进行测试驱动开发
我在应用程序开发方面只有2年以上的经验。在那两年中,我对发展的态度如下 分析需求 身份核心组件/对象,必需功能,行为,过程及其约束 创建类,它们之间的关系,对象行为和状态的约束 根据要求创建功能,处理行为约束 手动测试应用 如果需求更改修改组件/功能,则手动测试应用程序 最近,我对TDD进行了介绍,并认为这是进行开发的好方法,因为已开发的代码有充分的理由存在,并且可以缓解许多后期部署问题。 但是我的问题是我不能先创建测试,而是要标识组件,并在实际编写组件之前为它们编写测试。我的问题是 我做对了吗?如果不是,我到底要改变什么 有什么方法可以确定您编写的测试是否足够? 是针对非常简单的功能(相当于1 + 1 = 2)编写测试的好习惯吗? 更改功能并相应地测试需求是否有所变化是否很好?

6
使用朋友类在C ++中进行单元测试私有方法
我知道这是一个有争议的做法,但是让我们假设这对我来说是最佳选择。我想知道执行此操作的实际技术是什么。我看到的方法是这样的: 1)与我要测试的方法的班级做一个朋友班。 2)在friend类中,创建一个公共方法,该公共方法调用被测试类的私有方法。 3)测试好友类的公共方法。 这是一个简单的示例来说明上述步骤: #include <iostream> class MyClass { friend class MyFriend; // Step 1 private: int plus_two(int a) { return a + 2; } }; class MyFriend { public: MyFriend(MyClass *mc_ptr_1) { MyClass *mc_ptr = mc_ptr_1; } int plus_two(int a) // Step 2 { return mc_ptr->plus_two(a); } private: …

2
我如何知道我是否有足够的单元测试范围来删除集成测试?
我正在使用旧系统(这意味着它是在没有测试的情况下编写的)。我们试图通过编写集成测试来测试某些系统,这些集成测试从外部测试功能。 这使我有信心重构代码的某些部分,而不必担心会破坏它。但是问题在于这些集成测试需要一个部署(2分钟以上)和很多分钟才能运行。而且,它们很难维持。它们每个都覆盖了数千行代码,当其中一个中断时,可能需要花费数小时来调试原因。 我最近为这些功能更改编写了很多单元测试,但是在提交之前,我总是做一个新的部署并运行所有集成测试,以确保我不会错过任何东西。至此,我知道我的单元测试和某些集成测试与它们的测试重叠。 我怎么知道我的良好单元测试足以覆盖不良的集成测试,以便我可以删除该集成测试?

4
如果每个测试只能有一个断言;如何测试多个输入?
我正在尝试建立一些测试用例,并且已阅读到您应该尝试限制每个测试用例的断言数量。 所以我的问题是,测试带有多个输入的功能的最佳方法是什么?例如,我有一个函数,可分析用户的字符串并返回分钟数。字符串可以采用形式"5w6h2d1m",其中w, h, d, m对应于星期,小时,天和分钟数。 如果我想遵循“每个测试规则1条断言”,我将不得不对每种输入变化进行多次测试?这似乎很愚蠢,所以我只有这样: self.assertEqual(parse_date('5m'), 5) self.assertEqual(parse_date('5h'), 300) self.assertEqual(parse_date('5d') ,7200) self.assertEqual(parse_date('1d4h20m'), 1700) 在一个测试用例中。有没有更好的办法?

5
什么是第三方代码?
受此问题启发使用第三方库-始终使用包装器吗? 我想知道人们实际上认为第三方库是什么。 来自PHP的示例: 如果我正在使用Zend框架构建应用程序,是否应该将Zend框架库视为第三方代码? C#中的示例: 如果正在构建桌面应用程序,是否应该将所有.Net类都视为第三方代码? Java示例: 是否应将JDK中的所有库都视为第三方库? 有人说,如果一个库是稳定的并且不会经常更改,那么就不需要包装它。但是我看不到如何包装不依赖第三方代码的类。

6
我们应该排除代码进行代码覆盖率分析吗?
我正在开发几个应用程序,主要是遗留应用程序。当前,它们的代码覆盖率非常低:通常在10%到50%之间。 自几周以来,我们与班加罗尔团队进行了周期性讨论(开发的主要部分在印度境外进行),以排除Cobertura的软件包或类(我们的代码覆盖率工具,即使我们当前正在迁移到JaCoCo)也是如此。 他们的观点如下:由于他们不会在应用程序的某些层上编写任何单元测试(1),因此应将这些层简单地排除在代码覆盖率范围之外。换句话说,他们希望将代码覆盖率度量标准限制为已测试或应该测试的代码。 同样,当他们为复杂的类进行单元测试时,由于在大型应用程序中所带来的好处-仅在代码覆盖率方面-不会被注意到。减少代码覆盖范围的范围将使这种工作更加明显。 这种方法的好处是我们将有一个代码覆盖率度量,它指示我们认为可测试的应用程序部分的当前状态。 但是,我的观点是我们在某种程度上伪造了数字。该解决方案是轻松实现更高级别代码覆盖率的简便方法。令我困扰的另一点是:如果我们显示从一个星期到另一个星期的覆盖率增加,我们如何分辨这个好消息是由于开发人员的良好工作还是仅仅是由于新的排除因素? 此外,我们将无法确切知道代码覆盖率度量中考虑的内容。例如,如果我有10,000行代码应用程序,且代码覆盖率达到40%,则可以推断出40%的代码库已经过测试(2)。但是,如果我们设置排除条件会怎样?如果现在代码覆盖率达到60%,我该如何准确扣除?我的“重要”代码库中有60%经过测试了吗?我怎么能够 就我而言,即使我们对此不太满意,我还是希望保留“真实的”代码覆盖率值。此外,借助Sonar,我们可以轻松地在代码库中导航,并知道任何模块/包/类的代码覆盖范围。但是,当然,全球代码覆盖率仍然很低。 您对该主题有何看法?您如何处理项目? 谢谢。 (1)这些层通常与UI / Java bean等有关。 (2)我知道那不是事实。实际上,这仅意味着我的代码库的40%

4
单元测试静态类型的功能代码
我想问大家,在这种情况下,对以Haskell,scala,ocaml,nemerle,f#或haXe编写的静态类型的功能代码进行单元测试是有意义的(最后一个是我真正感兴趣的,但是我想利用更大社区的知识)。 我问这是因为,根据我的理解: 单元测试的一方面是使规范具有可运行的形式。但是,当采用声明性样式将规范化规范直接映射到语言语义时,实际上是否有可能以可运行的形式以独立方式表达规范,从而增加价值? 单元测试最明显的方面是跟踪无法通过静态分析发现的错误。鉴于类型安全的功能代码是一种非常接近静态分析器所理解的代码的好工具,因此您似乎可以将很多安全性转移到静态分析上。但是,无法涵盖代码中使用x而不是y(都为坐标)之类的简单错误。OTOH在编写测试代码时也可能会出现这样的错误,因此我不确定是否值得这样做。 单元测试确实引入了冗余,这意味着当需求改变时,实现它们的代码和涉及该代码的测试都必须被改变。当然,这种开销大约是恒定的,因此可以说,这并不重要。实际上,在像Ruby这样的语言中,它的确无法与优势相提并论,但是鉴于静态类型的函数式编程涵盖了许多基础单元测试的目的,因此感觉这是一个不变的开销,可以不付出任何代价就可以减少它。 由此推断,在这种编程风格中,单元测试已经过时了。当然,这样的主张只会导致宗教战争,所以让我将其归结为一个简单的问题: 当您使用这种编程风格时,您在什么程度上使用单元测试以及为什么使用(为什么希望代码获得什么质量)?或者反过来说:您是否有标准,可以用来限定静态分析器覆盖的静态类型功能代码单元,因此不需要单元测试范围?

5
什么时候应该和不应该使用'new'关键字?
我看了Misko Hevery 在Google Tech Talk上有关单元测试的演讲,他说避免new在业务逻辑代码中使用关键字。 我写了一个程序,最终还是在new各处使用了关键字,但是它们主要用于实例化保存数据的对象(即,它们没有任何功能或方法)。 我想知道,当我在程序中使用new关键字时,我做错什么了吗?我们在哪里可以打破“规则”?

6
参数化测试-您何时以及为何使用它们?
最近在工作中,我们对参数化测试存在一些意见分歧。通常,我们使用TDD样式(或至少尝试使用),因此我了解该方法的好处。但是,我很难看到参数化测试带来的收益。作为参考,我们致力于一项服务及其通过RESTful接口公开的库。 到目前为止,我所看到的是至少在Eclipse中使用JUnit的测试: 缺少详细信息-测试失败时,很难查看导致测试失败的参数 通常创建起来很复杂 倾向于在编写代码后创建-严格来说,这并不是缺点,但是人们在开始编写一段代码时是否着眼于参数化测试? 如果有人提供了一些示例,说明它们在哪些地方真正有用,甚至有任何很好的使用它们的提示,那就太棒了。我想确保我不仅固执己见,因为我个人不选择使用它们,而是查看它们是否属于我们应该考虑成为测试武器库的一部分。

4
Web应用程序中的测试驱动开发资源?[关闭]
按照目前的情况,这个问题并不适合我们的问答形式。我们希望答案会得到事实,参考或专业知识的支持,但是这个问题可能会引起辩论,争论,民意调查或扩展讨论。如果您认为此问题可以解决并且可以重新提出,请访问帮助中心以获取指导。 6年前关闭。 我想尝试在我们的Web应用程序中实现一些TDD,以减少回归并提高发行质量,但我不相信自动化测试在与Web应用程序一样蓬松的性能上能表现得如何。 我已经阅读并尝试了TDD和单元测试,但是示例都是“可靠的”,并且是诸如货币转换器之类的简单功能。 是否有任何资源可以帮助进行单元测试内容管理和发布系统?如何对购物车/商店(实物和在线产品)进行单元测试?AJAX? 谷歌搜索“ Web测试驱动开发”只是几年前的老文章,要么涉及类似计算器功能的示例,要么讨论为什么TDD比任何东西都要好(没有任何示例)。

4
推进代码审查和单元测试实践
作为一个团队领导来管理一组没有代码审查和单元测试经验(并且不需要)的开发人员,您如何提高代码审查和单元测试的实践水平? 您将如何创建一种方法,以使代码审查和单元测试自然地适合开发人员的流程? 这两个方面的阻力之一是“我们总是紧迫日期,因此没有时间进行代码审查和单元测试”。 代码审查的另一个阻力是我们目前不知道该怎么做。我们应该在每次入住时检查代码,还是在指定日期检查代码?

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.