Questions tagged «unit-testing»

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

8
在IF语句中对多个条件进行单元测试
我有一大堆看起来像这样的代码: function bool PassesBusinessRules() { bool meetsBusinessRules = false; if (PassesBusinessRule1 && PassesBusinessRule2 && PassesBusinessRule3) { meetsBusinessRules= true; } return meetsBusinessRules; } 我相信针对此特定功能应进行四个单元测试。三项测试if语句中的每个条件,并确保其返回false。另一项确保该函数返回true的测试。 问题:实际上应该有十个单元测试吗?九个检查每个可能的故障路径。IE浏览器: 错误错误错误 错误错误正确 错误正确错误 对于每种可能的组合,依此类推。 我认为这太过分了,但是我团队中的其他一些成员却没有。我的看法是,如果BusinessRule1失败,那么它应该始终返回false,无论是首先检查还是最后检查都没有关系。

6
数据库和单元/集成测试
我曾与某人讨论过Web应用程序的单元/集成测试,但我对1个核心思想存在分歧。问题是我正在谈论的人认为,单元测试工作所在的数据库应该在其中预先填充数据,并且我认为在执行测试之前和之后它应该完全为空。 我对数据库中预先填充的数据的担心是,无法确保数据保持良好状态。测试本身将要在数据库中创建,删除和修改数据,因此我真的看不到在开始测试之前在数据库中存储数据是一件好事。 似乎最好的测试数据库功能的方法是进行以下设置: 在测试实际运行之前的“设置”阶段,您首先要截断数据库中的所有表 然后,插入将要运行的测试用例所需的所有数据 然后运行并验证测试用例 然后在“拆卸”阶段,您再次截断数据库中的所有表 我没有其他更好的方法来确保要测试的数据是可以测试的好数据。 我在这里想念什么吗?这不是测试数据库相关功能的最佳方法吗?始终存在于数据库中的预填充数据库是否有好处(即使在开始测试之前或在测试完成之后)?对想法进行不同解释以更好地阐明我的观点的任何帮助也将是很棒的(也就是说,如果我的观点是有价值的)。

11
自动化测试:解释其业务价值
此问题是从Stack Overflow 迁移而来的,因为可以在Software Engineering Stack Exchange上回答。 迁移 8年前。 要开始我不认为这是一个重复的其他问题上的单元测试。我正在寻求帮助的是将其价值表达给程序员,分析师,经理和测试人员团队。通过自动化测试,我认为不需要区分单元测试(例如JUnit),BDD(例如JBehave,Fitness)和UI(Selenium,W​​atir),因为我认为它们都提供相似的价值(但您可以随意写一个不同意的答案:)) 以下是我已确定的列表,正在寻找有助于扩展或完善的答案: 节省时间/成本:编写自动化测试比编写测试案例要花费更多时间。但是,考虑到测试要运行多次,执行自动化测试的边际工作(即成本/时间)要少几个数量级。自动化测试运行便宜,这有助于随着时间的推移更改系统。 文档:没有比测试更真实的方法知道系统如何工作了。其他任何文档通常在撰写时就已过时,但是测试(至少是通过的测试)揭示了事情的实际运行方式。最终用户和API文档均是如此。 代码质量:测试写作迫使您: 考虑客户,因为测试是客户 打破使代码可测试的依赖关系,这通常意味着弄清楚如何使代码不需要其他大型系统可用

12
同事不愿使用单元测试“因为要编写更多代码”
一位同事不愿使用单元测试,而是选择快速测试,然后将其传递给用户,如果一切顺利,它会实时发布。毋庸置疑,某些错误确实可以解决。 我提到我们应该考虑使用单元测试-但是一旦意识到必须编写更多代码,她全都反对。这使我无法修改某些内容,并且不确定输出是否相同,尤其是因为她的代码是意大利细面条,因此我会在有机会时尝试对其进行重构。 那么对我来说最好的前进方向是什么?

3
在单元测试中挣扎于循环依赖
我正在尝试通过使用TDD开发类似于Bit Vector的简单方法来练习TDD。我碰巧正在使用Swift,但这是一个与语言无关的问题。 My BitVector是一个struct存储单个的UInt64,并在其上方提供一个API,可让您将其视为集合。细节无关紧要,但是很简单。高57位是存储位,低6位是“计数”位,它告诉您实际上有多少个存储位存储一个包含的值。 到目前为止,我有一些非常简单的功能: 构造空位向量的初始化程序 count类型的属性Int isEmpty类型的属性Bool 等于运算符(==)。注意:这是类似于Object.equals()Java 的值相等运算符,而不是像==Java中的引用相等运算符。 我遇到了一堆周期性依赖关系: 测试我的初始化程序的单元测试需要验证新构造的BitVector。它可以通过以下三种方式之一进行操作: 校验 bv.count == 0 校验 bv.isEmpty == true 检查一下 bv == knownEmptyBitVector 方法1依赖count,方法2依赖isEmpty(它本身依赖count,因此没有用处),方法3依赖==。无论如何,我不能孤立地测试初始化​​程序。 测试是否count需要对某些东西进行操作,这不可避免地会测试我的初始值设定项 实施isEmpty依赖count 执行==依赖count。 我能够通过引入一个私有API来部分解决此问题,该API BitVector从现有的位模式(作为UInt64)构造一个。这使我可以在不测试任何其他初始化程序的情况下初始化值,以便可以向上“引导”。 为了使我的单元测试真正成为单元测试,我发现自己做了很多黑客操作,这使我的产品和测试代码大大复杂化。 您如何解决这些问题?

8
在代码审查期间编写测试是否有益?
我的一个同事提出了一个我发现很有趣的想法。 假设我们不做TDD,那么由进行审核的人员在代码审阅期间编写测试是否有益? 对于这个问题,假定这是一个纯粹的学术项目,因此没有生命危险。而且该团队是4个人。每个人都知道该语言,并且熟悉所使用的所有工具/库/框架,并且可以编写测试。因此,基本上不是高级全职首席忍者工程师,而是体面的编码人员的人。 我发现的优点: 鼓励在审阅期间对代码有更深入的了解,以编写有意义的测试。 然后,您可以添加由正在测试的代码的作者进行的那些测试的代码审查。 我发现的缺点: 代码编写和测试之间的反馈循环不断增长。 编辑:我知道它不能在“正常”的Web应用程序上正常工作。我想到的是一个极端的案例,在该案例中,您需要实施复杂,科学的算法,这些算法都需要注意细节。让我们假设实现自己的图形库,NLP等。我想知道我们正在编写的代码是否与数据库隔离,并且这样很难理解却不会增加控制级别,而另一个需要了解源代码的人代码并进行有意义的测试,从而使整个过程不太容易受到那些不太明显的bug的影响,这些bug不会使应用程序崩溃,但最终会使您的结果混乱?

10
是单元测试开发还是测试?
我与测试经理讨论了单元测试和集成测试的作用。她要求开发人员报告他们已对单元和集成进行了什么测试以及如何进行测试。我的观点是,单元测试和集成测试是开发过程的一部分,而不是测试过程。除了语义之外,我的意思是,单元和集成测试不应包含在测试报告中,并且系统测试人员不应对此感到担忧。我的推理是基于两件事。 总是根据接口和合同计划和执行单元和集成测试。无论您是否使用正式合同,您都仍在测试应该执行的方法,例如合同。 在集成测试中,您将测试两个不同模块之间的接口。接口和合同确定测试何时通过。但是,您始终只能测试整个系统的有限部分。另一方面,系统测试是根据系统规范计划和执行的。规格确定测试何时通过。 在将单元测试和集成测试的广度和深度传达给(系统)测试器时,我看不到任何价值。假设我写了一份报告,列出了在特定业务层类上执行哪种单元测试。他/她应该从中学到什么? 从此判断应该测试和不应该测试的内容是一个错误的结论,因为即使所有单元测试和集成测试都通过了,系统仍可能无法按照规范要求的方式运行。 这看起来似乎是没有用的学术讨论,但是如果您像我一样在严格的正式环境中工作,那么对于确定我们的工作方式实际上很重要。无论如何,我完全错了吗?

7
如何避免易碎的单元测试?
此问题是从Stack Overflow 迁移而来的,因为可以在Software Engineering Stack Exchange上回答。 迁移 8年前。 我们已经编写了将近3,000个测试-数据已经过硬编码,很少重复使用代码。这种方法已经开始使我们陷入困境。随着系统的变化,我们发现自己花费更多的时间来修复损坏的测试。我们有单元测试,集成测试和功能测试。 我正在寻找一种确定的方式来编写可管理和可维护的测试。 构架 FakeItEasy 单位 自动修复

1
在开发过程中创建单元测试对开发时间以及维护活动所花费的时间有什么影响?
我是一名顾问,我将向客户现场的所有开发人员介绍单元测试。我的目标是确保所有新应用程序都应对所有创建的类进行单元测试。 客户端因修复其现有应用程序中的错误而存在高维护成本的问题。他们的应用程序的寿命介于5到15年之间,在此期间,他们不断添加新功能。我非常有信心,他们将从单元测试开始中受益匪浅。 我对单元测试对开发时间和成本的影响感兴趣: 作为开发过程的一部分,编写单元测试会增加多少时间? 通过良好的单元测试,可以节省多少维护活动(测试和调试)时间?

4
每个单元测试是否应该能够独立于其他测试运行?
假设您有针对类的两种方法的测试。第一种方法从另一层收集数据,并将其放入独立于运行时的某种存储中(例如SQL表),因此,此测试处理的所有数据都被硬编码到测试中。第二种方法负责从第一种方法保留的位置获取数据并以某种方式进行转换(计算,将某些零件移动到其他位置等)。 现在,第二种方法可以像第一种方法那样对输入进行硬编码,或者可以假设这两个测试将按顺序运行,并且可以从第一个测试中断的位置开始,获取第一个测试真正存储的数据。 如果您选择了第二个选项,那么您确实会很好地认为这两种方法可以很好地协同工作,但是,如果第一个测试失败了,则所有测试都将失败,从而失去了帮助更快地隔离错误的测试优势。 如果选择第一种方法,则每种方法都将被隔离和独立测试,但是您永远不会真正知道它们是否可以真正正常地协同工作。 这里哪个更好?是否存在某种替代方法,例如对每个隔离的方法都使用硬编码进行一次测试,然后将两个方法合而为一的更大的测试?

2
集成测试是否使用模拟?
我目前在软件测试课程中,对于我们的学期项目,我们必须对其执行多种类型的测试,例如单元测试和集成测试。教授说,对于集成测试,在我们的集成测试中使用了模拟和模拟库(例如EasyMock和Mockito)。不过我有点困惑。集成测试是在类,模块,服务等外部进行测试。如果要测试多个类和服务,为什么在集成测试中应适当使用模拟和存根?

4
CI如何用于解释语言?
我以前从未使用过持续集成系统(CI)。我主要使用MATLAB,Python或PHP进行编码。这些都没有构建步骤,我看不到如何将CI用于我的工作。一家大型公司的大型项目中的一位朋友告诉我,语言并不重要。 如果没有构建步骤,我看不到CI对我有什么用。我可以将CI视为可以运行单元测试的测试环境。我想念什么吗?

2
具有在线功能的单元测试课程
当类的单元测试功能具有需要在线功能的私有功能时。人们将如何进行测试? 例如: public class Foo { public int methodA() { int val = goOnlineToGetVal(); return val; } private int goOnlineToGetVal() { CloudService c = new CloudService(); int oval = c.getValueFromService(); return oval; } } 如果我要测试功能:“ methodA()”,它将尝试使用“ goOnlineToGetVal()”,但是如果此测试在没有功能的情况下,它将尝试联机。不上网怎么办100%的课堂覆盖率?

6
在TDD中,我必须首先编写“测试”还是“接口”?
我正在使用c#学习TDD,据我所知测试应该驱动开发,即在编写最基本的代码以通过测试之后再进行重构,然后首先编写一个失败的测试。 但是也有人说“ 程序到接口,而不是实现 ”,因此请首先编写一个接口。这是我开始困惑的地方,如果我先写接口,那将违反两件事 为接口编写的代码不受test的驱动。 这显然不是最低要求,我可以用一个简单的类编写它。 我也应该从编写接口测试开始吗?没有任何实现,我要测试什么? 如果这个问题听起来很傻,对此我感到非常困惑。可能是我从字面上讲。
23 c#  unit-testing  tdd 

5
端到端测试与单元测试之间,应该将测试解耦吗?
在我们公司,我们通常会确保为我们的网站/ Web应用程序编写一个端到端测试。这意味着我们访问一个URL,填写一个表单,将该表单提交到另一个URL并检查页面结果。我们这样做是为了测试表单验证,测试HTML模板是否具有正确的上下文变量等。 我们还使用它间接测试基础逻辑。 一位同事告诉我,这样做的原因是,只要端到端测试通过,我们就可以随时淘汰和更改基础实现。 我想知道这种解耦是否有意义,或者这仅仅是避免编写针对较小代码单元的测试的方法?

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.