Questions tagged «unit-testing»

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

5
在“无人问津”的世界中进行单元测试
我不认为自己是DDD专家,但作为解决方案架构师,请尽可能尝试应用最佳实践。我知道围绕DDD中的(公共)二传手“样式”的赞成和反对有很多讨论,我可以看到论点的两面。我的问题是,我在一个拥有各种技能,知识和经验的团队中工作,这意味着我不能相信每个开发人员都会以“正确”的方式做事。例如,如果我们设计域对象以便通过一种方法来执行对对象内部状态的更改,但提供公共属性设置器,则有人将不可避免地设置该属性而不是调用该方法。使用此示例: public class MyClass { public Boolean IsPublished { get { return PublishDate != null; } } public DateTime? PublishDate { get; set; } public void Publish() { if (IsPublished) throw new InvalidOperationException("Already published."); PublishDate = DateTime.Today; Raise(new PublishedEvent()); } } 我的解决方案是将属性设置器设为私有,这是可能的,因为我们用来为对象水合的ORM使用反射,因此它能够访问私有设置器。但是,这在尝试编写单元测试时会出现问题。例如,当我想编写一个单元测试来验证我们不能重新发布的要求时,我需要指出该对象已经发布。我当然可以通过两次调用Publish来做到这一点,但是我的测试假设第一次调用正确实现了Publish。好像有点臭。 让我们使用以下代码使场景更真实一些: public class Document { public Document(String title) …


7
单元测试中的代码质量?
在编写单元测试时,是否值得花费额外的时间使代码具有良好的质量和可读性? 在编写测试时,我经常会违反Demeter定律,以加快编写速度并避免使用太多变量。从技术上讲,单元测试不能直接重用-它们严格地与代码绑定,因此我看不出有什么理由要花很多时间在它们上面;他们只需要功能。

13
单元测试如何工作?
我试图使我的代码更健壮,并且我一直在阅读有关单元测试的信息,但是我发现很难找到实际有用的用法。例如,维基百科示例: public class TestAdder { public void testSum() { Adder adder = new AdderImpl(); assert(adder.add(1, 1) == 2); assert(adder.add(1, 2) == 3); assert(adder.add(2, 2) == 4); assert(adder.add(0, 0) == 0); assert(adder.add(-1, -2) == -3); assert(adder.add(-1, 1) == 0); assert(adder.add(1234, 988) == 2222); } } 我觉得这个测试是完全没有用的,因为您需要手动计算所需的结果并对其进行测试,我觉得这里会有更好的单元测试 assert(adder.add(a, b) == (a+b)); 但这只是在测试中对函数本身进行编码。有人可以为我提供一个实际使用单元测试的示例吗?仅供参考,我目前主要在编码“程序”函数,这些函数需要约10个布尔值和几个整数,并以此为基础给出整数结果,我觉得我唯一可以做的单元测试就是在测试。编辑:我还应该在移植(可能设计不当)红宝石代码(我没有做过)的同时精确化这一点

4
为什么不赞成测试MVC视图?
我目前正在为ASP.Net MVC应用程序奠定基础,并且正在研究应该准备编写哪种单元测试。我已经在多个地方看到人们在本质上说:“不要打扰测试您的观点,没有逻辑,这是微不足道的,将被集成测试所涵盖”。 我不明白这如何成为公认的智慧。集成测试的目的与单元测试的目的完全不同。如果我中断了某些事情,我不想在半小时后的集成测试中断时就知道,我想立即知道。 示例场景: 假设我们正在与一个Customer实体一起处理标准的CRUD应用。客户有名字和地址。在每个测试级别,我都想验证客户检索逻辑是否正确获取名称和地址。 为了对存储库进行单元测试,我编写了一个集成测试来访问数据库。为了对业务规则进行单元测试,我模拟了存储库,为业务规则提供适当的数据,并验证是否返回了预期的结果。 我想做的是: 为了对UI进行单元测试,我模拟了业务规则,设置了预期的客户实例,渲染了视图,并验证视图是否包含我指定的实例的适当值。 我要做的事情: 要对存储库进行单元测试,我编写了一个集成测试,设置了适当的登录名,在数据库中创建了所需的数据,打开浏览器,导航到客户,并验证结果页面是否包含适当的内容我指定的实例的值。 我意识到上面讨论的两种情况之间存在重叠,但是关键的区别在于设置和执行测试所需的时间和精力。 如果我(或另一个开发人员)从视图中删除了地址字段,则我不想等待集成测试发现这一点。我希望在每天多次获取的单元测试中被发现并标记出来。 我感到我只是没有掌握一些关键概念。有人可以解释为什么要对MVC视图的有效性立即进行测试反馈是一件坏事吗?(或者,如果还不错,则不是获得所说反馈的预期方式)

16
测试驱动开发是谁?
已锁定。该问题及其答案被锁定,因为该问题是题外话,但具有历史意义。它目前不接受新的答案或互动。 在过去的4.5年中,我一直在企业领域中工作,并且注意到,一般而言,企业对于测试优先的开发风格不是一个有利的环境。项目通常是固定成本,固定时间表和瀑布式的。任何单元测试(如果有的话)通常都在QA阶段开发后由另一个团队完成。 在为企业工作之前,我曾为许多中小型公司提供咨询服务,但没有一家公司愿意为测试优先的开发项目付费。他们通常希望开发立即开始,或者经过短暂的设计工作:即,类似于敏捷的东西,尽管有些客户希望将所有东西都映射为类似于瀑布的东西。 在哪种类型的商店,公司和客户中,测试驱动的开发最有效?哪些类型的项目倾向于有利于TDD?

3
为什么要编写控制器的单元测试?
对我来说,这是完全不相关的单元测试,我不明白为什么有人会花时间编写它,因为从中获得的价值很小。如果此控制器通过在浏览器中执行该方法返回所需的类型,我会非常清楚。确实,您认为需要为此进行测试吗?为什么? public class ConstituencyControllerTests { private ConstituencyController _constituencyController; private Mock<IConstituencyService> _IConstituencyServiceMock; public ConstituencyControllerTests() { _IConstituencyServiceMock = new Mock<IConstituencyService>(); } [Test] public async Task I_Check_For_Return_Type_And_Result() { _constituencyController = new ConstituencyController( _IConstituencyServiceMock.Object ); var result = await _constituencyController.Get(); var content = ( (dynamic)result ).Content; Assert.IsEmpty( content ); Assert.IsInstanceOf( typeof( System.Web.Http.Results.OkNegotiatedContentResult<IEnumerable<ListOfConstituencies>> ), result …

4
如何使用单元测试和TDD来测试主要依赖数据库CRUD操作的应用程序?
在工作中,我的项目之一主要是获取从外部客户端传入的数据并将其保存在数据库中。这是一个使用JPA的Java企业应用程序,我们的大多数逻辑都围绕CRUD操作展开。 我们的大多数错误都以一种或另一种方式涉及JPA。 示例1:如果单击保存按钮两次,JPA可能会尝试第二次将同一实体插入数据库,从而导致主键冲突。 示例2:您从数据库中检索一个实体,对其进行编辑,然后尝试更新其数据。JPA可能会尝试创建一个新实例,而不是更新旧实例。 解决方案通常需要添加/删除/更改JPA批注。其他时候,它与修改DAO逻辑有关。 我无法弄清楚如何使用单元测试和TDD对我们的代码充满信心。我不确定这是因为单元测试和TDD不合适,还是我错误地解决了这个问题。 单元测试似乎不合适,因为我只能在运行时发现这些问题,并且需要部署到应用服务器以重现这些问题。通常需要涉及数据库,而我认为这超出了单元测试的定义:这些是集成测试。 TDD似乎不合适,因为部署+测试反馈循环是如此之慢,以至于我效率低下。部署+测试反馈循环需要3分钟以上的时间,这就像我专门针对所编写的代码运行测试一样。要运行所有集成测试,需要30分钟以上的时间。 在此模型之外有代码,我总是尽可能地进行单元测试。但是,我们的大多数错误和最大的时间浪费总是涉及JPA或数据库。 还有另一个类似的问题,但是如果我遵循建议,我将包装代码中最不稳定的部分(JPA)并测试除此以外的所有内容。就我的问题而言,我将处于同样的糟糕境地。打包JPA之后的下一步是什么?海事组织,这个问题(也许)是回答我的问题的步骤,而不是答案。
22 java  unit-testing  tdd  jpa 

7
在同一冲刺中进行编码和测试
如果直到冲刺结束才完成全部或大部分编码,如何在与编码相同的冲刺中处理测试?(我指的是冲刺中单个PBI的“汤对坚果”开发和测试。) 我在网上看到的大多数答案都涉及QA自动化,但这实际上是不可能的,因为您通常需要功能性UI来记录或创建自动化测试。我只有故事板随着我开发功能和发现新需求而不断发展。 就我而言,我正在开发一个新的桌面应用程序。桌面应用程序通常无法很好地进行自动化测试。我有一些自动化的单元测试,但它们不是QA专业人员执行的手动功能/集成测试。 因此,我现在的状态是明天的sprint结束,我仍然需要完成编码,而且我的质量检查人员还没有要测试的东西,也不知道如何测试如果不握住我的手给我的东西。 我确定我不是第一个遇到这种困境的人。 过去,我做过一个管道:在当前的sprint中,测试团队测试在上一个sprint中已实现的功能。在我目前的工作中,PM将这种方法称为“瀑布”,因此是不可接受的。

2
如何创建将修复测试视为优先事项的环境?
我是一家中型公司的软件工程师。我们在TeamCity上运行着一个相当强大的测试平台。它会在每次签入时进行单元测试,并每天运行单元测试/ BVT。 问题是-我们有很多损坏的单元测试。 通常,如果单元测试经常中断且无法维护,我会提出毫无意义的建议。无法查看更改是否引起了回归,从而消除了单元测试平台的大部分价值。 我想种下一种会养成良好习惯文化的种子-破坏测试时将其修复,将其视为有价值的东西,将测试的固定与其他工作一起放在优先位置。 我已经尝试过贿赂(烘焙食品!),只是简单地询问,并与团队负责人交谈。每个人都说这是一个好主意,但我认为这是唯一对此做任何事情的人。 鼓励他人修复测试并在冲刺中优先考虑修复的最佳方法是什么? 如果有比较主观的方式提出这个问题,我很乐意接受任何提示。

6
我应该如何测试我的测试代码?
大多数软件开发人员都同意的几件事之一是,除非您对其进行测试,否则您不应依赖于代码才能正常工作。如果您不对其进行测试,则可能包含隐藏的错误,这些错误只会导致您日后要做更多的工作。 我知道如何测试我的普通代码,但是我应该如何测试我的测试代码,以确保它们可以有效地发现并报告出现的错误?我个人非常愚蠢,无法编写本应通过的错误测试用例,因此一开始就破坏了我编写测试的目的。幸运的是,我及时发现并修复了错误,但是根据测试的口头禅,如果没有一套自己的测试来确保它能够正常工作,似乎没有一套完整的测试套件。 在我看来,执行此操作的最佳方法是确保错误代码的测试失败。*如果我花2分钟的时间交替向代码中添加错误并确保失败,那么我应该有一个可以接受的信心,即测试“工作”。这使我想到第二个问题:有什么好的方法可以引入bug以确保它们被测试用例捕获?我是否应该随机注释掉语句,if-else否定条件来确保运行错误的分支,并更改带有副作用的代码的执行顺序等,直到我满意我的测试将抓住大多数常见的错误?专业开发人员如何验证他们的测试确实按照他们的预期去做?他们只是假设测试有效,还是花时间测试它们?如果是这样,他们如何测试测试? 我并不是在建议人们花太多时间测试他们的测试,然后再测试他们的测试,以至于他们从来没有真正编写过真正的代码,但是我做的愚蠢的事情让我觉得我可以从中受益进行“元测试”,并且对实现此目标的最佳方法感到好奇。:D *我可以检查在测试“无错误”代码时测试是否通过,但是使用代码作为测试规范似乎倒退了……

4
如何编写机器人(和其他机械设备)的单元测试?
我是高中机器人俱乐部的成员,并且负责对机器人进行编程。我不断听到各种各样的成年人的建议是,我应该编写单元测试来帮助验证我的代码。代码基础变得越来越大,我同意单元测试对帮助我更快地发现错误确实很有帮助。 但是,我不完全确定如何实现这一目标。据我所知,单元测试是通过采用一个函数(或代码的子系统)并向其提供一组输入以确保每次输出都具有相同的输出来完成的。我目前拥有的代码不会进行繁琐的数据处理,而是直接操作机器人上的硬件组件。大多数复杂性来自确保电子设备健全,当前代码与机器人上的实际硬件相匹配等等。通常,我只能通过将代码加载到机器人本身来查看是否存在问题,并尝试运行它。 通过扩展,如何为旨在操作任何机械设备的代码编写单元测试?在我看来,您只能通过肉眼观察机器的运行来捕获错误。 还是我只是误解了单元测试应该如何工作? (如果重要的话,这里是代码,它是用C ++编写的,我正在参加FRC)

3
假冒被测课程的一部分可以吗?
假设我有一个类(请原谅人为的示例及其错误的设计): class MyProfit { public decimal GetNewYorkRevenue(); public decimal GetNewYorkExpenses(); public decimal GetNewYorkProfit(); public decimal GetMiamiRevenue(); public decimal GetMiamiExpenses(); public decimal GetMiamiProfit(); public bool BothCitiesProfitable(); } (请注意,GetxxxRevenue()和GetxxxExpenses()方法具有依赖项,这些依赖项已被删除) 现在,我正在对取决于GetNewYorkProfit()和GetMiamiProfit()的BothCitiesProfitable()进行单元测试。可以对GetNewYorkProfit()和GetMiamiProfit()存根吗? 似乎如果我不这样做,那么我同时要同时测试GetNewYorkProfit()和GetMiamiProfit()以及BothCitiesProfitable()。我必须确保为GetxxxRevenue()和GetxxxExpenses()设置存根,以便GetxxxProfit()方法返回正确的值。 到目前为止,我只看到了对外部类而非内部方法的依赖关系进行存根的示例。 如果可以的话,是否应该使用一种特定的模式来执行此操作? 更新 我担心我们可能会遗漏核心问题,这可能是我的拙劣例子的错。基本的问题是:如果一个类中的方法依赖于该类中另一个公开的方法,是否可以(甚至建议)将另一个方法存根? 也许我错过了一些东西,但是我不确定分班总是有意义的。也许另一个更好的例子是: class Person { public string FirstName() public string LastName() public string FullName() } 全名定义为: public string …


6
单元测试真的用作文档吗?
我无法数出“单元测试是被测代码文档的重要来源”这一类读语句的次数。我不否认他们是真实的。 但就我个人而言,我从来没有发现自己将它们用作文档。对于我使用的典型框架,方法声明记录了它们的行为,而这就是我所需要的。我假设单元测试将备份该文档中所述的所有内容,并可能还会添加一些其他内部内容,因此,一方面它会复制文档,而另一方面可能会添加一些不相关的内容。 所以问题是:什么时候将单元测试用作文档?什么时候评论不能涵盖所有内容?通过开发人员扩展源代码?他们公开了哪些文档本身无法公开的有用和相关的内容?

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.