Questions tagged «unit-testing»

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

5
测试列表…针对每种情况都在同一测试中还是在一项测试中?
我正在测试某个功能是否可以实现列表中的预期功能。所以我要测试 f(null) -> null f(empty) -> empty f(list with one element) -> list with one element f(list with 2+ elements) -> list with the same number of elements, doing what expected 为此,最好的方法是什么? 在同一(方法)测试中测试所有案例,名称为“ WorksAsExpected” 针对每种情况进行一次测试,因此 “ WorksAsExpectedWhenNull” “ WorksAsExpectedWhenEmpty” “ WorksAsExpectedWhenSingleElement” “ WorksAsExpectedWhenMoreElements” 我没有想到的另一种选择:-)
21 unit-testing  tdd 

4
函数式编程是否可以替代依赖项注入模式?
我最近读了一本书,名为《用C#进行函数式编程》,我发现函数式编程的不可变和无状态本质可以实现与依赖注入模式相似的结果,并且可能甚至是更好的方法,尤其是在单元测试方面。 如果对这两种方法都有经验的人可以分享他们的思想和经验以回答主要问题,我将不胜感激:函数式编程是否可以替代依赖项注入模式?


5
如何对需要Web服务调用的类进行单元测试?
我正在尝试测试一个调用某些Hadoop Web服务的类。代码几乎是以下形式: method() { ...use Jersey client to create WebResource... ...make request... ...do something with response... } 例如,有一个创建目录方法,一个创建文件夹方法等。 鉴于代码正在处理我无法控制的外部Web服务,我该如何对其进行单元测试?我可以尝试模拟Web服务客户端/响应,但这违反了我最近看到的指导方针:“不要模拟您不拥有的对象”。我可以设置一个虚拟Web服务实现-仍然构成“单元测试”还是将其作为集成测试?只是不可能在如此低的水平上进行单元测试-TDD从业者将如何做到这一点?

3
由于需要过多的模拟而导致单元测试脆弱
关于我们在团队中实施的单元测试,我一直在遇到越来越烦人的问题。我们正在尝试将单元测试添加到设计不良的旧代码中,尽管我们在实际添加测试方面没有遇到任何困难,但是我们开始为测试的结果而苦恼。 作为问题的一个示例,假设您有一个方法在执行过程中调用了5个其他方法。此方法的测试可能是确认是否由于调用这5个其他方法之一而导致了行为。因此,由于单元测试应该仅出于一个原因和一个原因而失败,因此您希望消除调用这四种方法并对其进行模拟而导致的潜在问题。大!执行单元测试,忽略模拟的方法(它们的行为可以作为其他单元测试的一部分进行确认),并且验证有效。 但是存在一个新问题-单元测试对您如何确认将来行为和任何其他4种方法的签名变化或需要添加到“父方法”的任何新方法有深入了解。导致必须更改单元测试以避免可能的故障。 自然地,可以通过简单地使更多的方法完成更少的行为而在某种程度上缓解该问题,但是我希望可以找到一个更优雅的解决方案。 这是捕获问题的示例单元测试。 简要说明一下,“ MergeTests”是一个单元测试类,它继承自我们正在测试的类,并根据需要覆盖行为。这是我们在测试中采用的“模式”,允许我们覆盖对外部类/依赖项的调用。 [TestMethod] public void VerifyMergeStopsSpinner() { var mockViewModel = new Mock<MergeTests> { CallBase = true }; var mockMergeInfo = new MergeInfo(Mock.Of<IClaim>(), Mock.Of<IClaim>(), It.IsAny<bool>()); mockViewModel.Setup(m => m.ClaimView).Returns(Mock.Of<IClaimView>); mockViewModel.Setup( m => m.TryMergeClaims(It.IsAny<Func<bool>>(), It.IsAny<IClaim>(), It.IsAny<IClaim>(), It.IsAny<bool>(), It.IsAny<bool>())); mockViewModel.Setup(m => m.GetSourceClaimAndTargetClaimByMergeState(It.IsAny<MergeState>())).Returns(mockMergeInfo); mockViewModel.Setup(m => m.SwitchToOverviewTab()); mockViewModel.Setup(m => m.IncrementSaveRequiredNotification()); mockViewModel.Setup(m …

6
添加单元测试对知名的旧版代码有意义吗?
我说的是TDD意义上的单元测试。(不是自动的“集成”,或者您喜欢称之为测试的东西。) 遗留代码,如:(C ++)没有测试的代码。(请参阅:Michael Feathers的“ 旧版代码有效工作”) 但是还有一些遗留代码,例如:我们的团队在过去10到5年中一直在使用的代码,因此我们通常对将事物放置在何处可以改变事物有一个很好的认识。 我们确实对某些模块进行了单元测试(通过Boost.Test),这些模块后来出现或很自然地适合单元测试(常见的应用程序特定容器,字符串填充,网络助手等)。 我们尚未进行适当的自动化验收测试。 现在,最近,我很高兴地实现了3个新的面向用户的功能。 每个人花了我大约1-2个小时来快速掌握我需要更改的代码部分,花了1-2小时来实现我需要更改的(小)代码,另外花了1-2个小时来确保应用程序之后正确运行,并且确实应该这样做。 现在,我确实添加了很少的代码。(我认为每个功能都有一个方法和一些调用行。) 分解出这段代码(通过WEwLC中建议的任何一种方法),以使单元测试变得有意义(而不是完整的重言式)将很容易又花费2-4个小时,甚至更多。这将为每个功能增加50%-100%的时间,而没有立即的好处,因为 我不需要单元测试即可了解有关代码的任何信息 手动测试的工作量是相同的,因为我仍然需要测试代码是否正确集成到应用程序的其余部分中。 当然,如果,以后,“有人”走过来,碰到的代码,他理论上可以有从单元测试的一些好处。(仅从理论上讲,因为经过测试的代码孤岛将生活在未经测试的代码海洋中。) 因此,“这一次”,我选择不做添加单元测试的艰苦工作:对代码进行更改以使要测试的东西要比对代码进行更改(要正确(清晰地)实现功能)复杂得多。 这是强耦合旧代码的典型代表吗?我是不是很懒?我们是否将团队的优先顺序设置错了?还是我谨慎,只测试开销不太高的东西?
21 c++  tdd  legacy  unit-testing 

7
当成为团队的新成员时,您如何处理现有集成和单元测试的质量?
我在职业生涯中遇到的一个反复出现的主题是成为新的开发人员加入团队,并很快对现有的单元和集成测试套件产生内在的不信任。 在面试过程中,管理层告诉您,他们“大力支持单元测试”,并公开鼓励他们进行测试。他们可以,但是关于测试本身的一切都是错误的。就像他们声称拥有100%集成测试覆盖率但少于10%可重复单元测试覆盖率时声称100%覆盖率这一事实。我发现了一些其他问题: 在什么是单元测试和什么是集成测试之间没有明确的指示。单元测试和集成测试在同一个类别中混合在一起。 尚未声明对特定环境的数据库中非常特定的动态数据有明确依赖关系的集成测试。 非事务集成测试,基本上是可能会或可能不会麻烦自行清理的测试,有时需要手动数据库“清理”以使测试可重复。 绝不进行任何模拟,而应用程序代码则需要进行大修,以使模拟成为可能。换句话说,设计时不要考虑测试。 没有明确的命名约定可以快速查看测试名称并大致确定要进行的测试。 这并不是说所有测试都是无用的或不好的,很多测试都相当好并且值得保留,但是有时候感觉就像淘金。我故意避免运行测试,只是因为我担心为黑箱测试用例搞砸数据库。 从本质上讲,这使我对单元和集成测试产生了固有的不信任感,而我个人没有以某种方式编写或审查这些测试。在某种程度上,如果您对测试套件的质量不抱有信心,那么它实际上对团队或项目毫无价值。 当您发现自己处于这种情况时该怎么办?您认为最佳的攻击计划是应对此类问题? 是否应该在跨发行版的巨大努力下重构所有测试?您是否应该放弃这个旧项目可能会有一天可靠的单元测试范围的想法?

7
关于单元测试的最佳书籍,文章和文献
按照目前的情况,这个问题不适合我们的问答形式。我们希望答案会得到事实,参考或专业知识的支持,但是这个问题可能会引起辩论,争论,民意调查或扩展讨论。如果您认为此问题可以解决并且可以重新提出,请访问帮助中心以获取指导。 8年前关闭。 已锁定。该问题及其答案被锁定,因为该问题是题外话,但具有历史意义。它目前不接受新的答案或互动。 在我的工作组中引入单元测试的斗争中,我发现很多人对此概念一无所知。你能建议: 快速介绍相关主题的最佳文章或教程 深入学习单元测试的最佳综合书籍 证明单元测试有效的学术作品和研究

6
使用TDD时如何删除功能或功能
在有关TDD的文章中,我经常在重构步骤中读到“删除重复项”或“提高可读性”。但是,什么使我删除了未使用的功能? 例如,假设有一个C带有方法a()和的类b()。现在我认为有一个f()被驱动的方法会很不错C。实际上,除定义/描述的单元测试外,f()所有对的调用都将替换。不再需要-测试除外。b()b() 删除b()和使用它的所有测试是否保存?那是“提高可读性”的一部分吗?

3
在测试和生产代码之间复制常量?
在测试和真实代码之间复制数据是好是坏?例如,假设我有一个Python类FooSaver,该类将具有特定名称的文件保存到给定目录: class FooSaver(object): def __init__(self, out_dir): self.out_dir = out_dir def _save_foo_named(self, type_, name): to_save = None if type_ == FOOTYPE_A: to_save = make_footype_a() elif type == FOOTYPE_B: to_save = make_footype_b() # etc, repeated with open(self.out_dir + name, "w") as f: f.write(str(to_save)) def save_type_a(self): self._save_foo_named(a, "a.foo_file") def save_type_b(self): self._save_foo_named(b, "b.foo_file") 现在,在我的测试中,我想确保所有这些文件均已创建,因此我想说一下这样的话: …


3
为有状态系统设计单元测试
背景 在我完成学业后,测试驱动开发得到了普及。我正在尝试学习它,但是一些主要的事情仍然无法解决。TDD的支持者说了很多类似的东西(以下称为“单一声明原则”或SAP): 一段时间以来,我一直在思考TDD测试如何尽可能简单,富有表现力和优雅。本文探讨了使测试尽可能简单和可分解的感觉:针对每个测试中的单个断言。 来源:http://www.artima.com/weblogs/viewpost.jsp? thread = 35578 他们还说这样的话(以下称为“私有方法原理”或PMP): 通常,您不直接对私有方法进行单元测试。由于它们是私有的,因此请考虑将其作为实现细节。没有人会打电话给他们中的一个,并期望它以特定的方式工作。 相反,您应该测试您的公共接口。如果调用您的私有方法的方法按预期工作,则可以假定您的私有方法正常工作。 资料来源:您如何对私有方法进行单元测试? 情况 我正在尝试测试有状态的数据处理系统。给定接收数据之前的状态,系统可以对完全相同的数据执行不同的操作。考虑一个简单的测试,该测试建立系统中的状态,然后测试给定方法要测试的行为。 SAP建议我不要测试“状态构建过程”,我应该假设状态是我希望从构建代码中得到的状态,然后测试我要测试的一个状态更改 PMP建议我不能跳过此“状态建立”步骤,而只能测试独立控制该功能的方法。 我实际代码中的结果是测试膨胀,复杂,冗长且难以编写。而且,如果状态转换发生变化,则必须更改测试……这对于小型,高效的测试是可以的,但对于这些冗长的测试却非常耗时且令人困惑。通常如何做?

3
TDD和重构遇到的困难(或者-为什么这比应该的要痛苦得多?)
我想教自己使用TDD方法,而我有一个项目想要工作一段时间。这不是一个大项目,所以我认为这将是TDD的不错的选择。但是,我感觉有些不对劲。让我举个例子: 在较高级别上,我的项目是Microsoft OneNote的加载项,它使我可以更轻松地跟踪和管理项目。现在,如果我决定建立自己的自定义存储和后端的一天,我还希望保持与OneNote分离的业务逻辑。 首先,我从一个基本的普通单词接受测试开始,概述了我希望我的第一个功能要做的事情。看起来像这样(为简洁起见,将其复制): 用户点击创建项目 用户输入项目标题 验证项目创建正确 跳过UI内容和一些中介计划,我来进行第一次单元测试: [TestMethod] public void CreateProject_BasicParameters_ProjectIsValid() { var testController = new Controller(); Project newProject = testController(A.Dummy<String>()); Assert.IsNotNull(newProject); } 到目前为止,一切都很好。红色,绿色,重构等。现在它实际上需要保存内容。在这里减少一些步骤,我对此很满意。 [TestMethod] public void CreateProject_BasicParameters_ProjectMatchesExpected() { var fakeDataStore = A.Fake<IDataStore>(); var testController = new Controller(fakeDataStore); String expectedTitle = fixture.Create<String>("Title"); Project newProject = testController(expectedTitle); Assert.AreEqual(expectedTitle, newProject.Title); } …

3
单元测试C ++:要测试什么?
TL; DR 编写好的,有用的测试很困难,并且在C ++中代价很高。您是否有经验的开发人员可以就什么以及何时进行测试分享您的理论依据? 很长的故事 我曾经做过测试驱动的开发,实际上是整个团队,但对我们来说效果不佳。我们有很多测试,但是它们似乎从来没有覆盖我们有实际错误和回归的情况-通常是在单元交互时发生的,而不是因为它们孤立的行为而发生。 这通常很难在单元级别进行测试,以至于我们停止了TDD测试(组件确实可以加快开发速度),而花了更多时间增加集成测试的覆盖范围。尽管小型单元测试从未捕获任何实际的错误,并且基本上只是维护开销,但集成测试确实值得付出努力。 现在,我继承了一个新项目,并且想知道如何进行测试。它是本机C ++ / OpenGL应用程序,因此集成测试并不是真正的选择。但是C ++中的单元测试比Java中的要难一些(您必须显式地制作东西virtual),并且该程序不是很面向对象的,所以我无法模拟/存根一些东西。 我不想为了编写测试而仅仅为了编写一些测试而拆开并OO化整个过程。所以我问你:我应该为测试写什么?例如: 我希望经常更改的函数/类? 难以手动测试的函数/类? 已经易于测试的功能/类? 我开始研究一些受人尊敬的C ++代码库,以了解它们如何进行测试。现在,我正在研究Chromium源代码,但发现很难从代码中提取其测试依据。如果有人有一个很好的例子或关于C ++用户(委员会,书籍作者,Google,Facebook,Microsoft等人的看法)如何发表文章的帖子,那将特别有帮助。 更新资料 自编写此书以来,我一直在这个网站和网络上进行搜索。找到了一些好东西: 什么时候不进行单元测试? /programming/109432/what-not-to-test-when-it-comes-to-unit-testing http://junit.sourceforge.net/doc/faq/faq.htm#best 可悲的是,所有这些都是以Java / C#为中心的。用Java / C#编写大量测试不是一个大问题,因此收益通常超过了成本。 但是正如我上面所写,在C ++中要困难得多。尤其是如果您的代码库不是那么OO,那么您就必须认真弄乱事情,以获得良好的单元测试覆盖率。例如:我继承的应用程序具有一个Graphics名称空间,该名称空间是OpenGL之上的薄层。为了测试任何实体(它们都直接使用其功能),我必须将其变成一个接口和一个类,并将其注入所有实体中。那只是一个例子。 因此,在回答这个问题时,请记住,我必须在编写测试方面投入大量资金。

3
如何在单元测试中正确比较双精度值是否相等?
我最近设计了一个时间序列模块,我的时间序列本质上是一个SortedDictionnary<DateTime, double>。 现在,我想创建单元测试,以确保该模块始终正常工作并产生预期的结果。 常见的操作是计算时间序列中各点之间的性能。 所以我要做的是创建一个带有{1.0,2.0,4.0}的时间序列(在某些日期),我希望结果是{100%,100%}。 关键是,如果我手动创建具有值{1.0,1.0}的时间序列,并检查是否相等(通过比较每个点),则测试将无法通过,因为使用实数的二进制表示时将始终存在错误数字。 因此,我决定创建以下功能: private static bool isCloseEnough(double expected, double actual, double tolerance=0.002) { return squaredDifference(expected, actual) < Math.Pow(tolerance,2); } 是否有另一种处理此类案件的常用方法?

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.