Questions tagged «tdd»

TDD代表测试驱动开发或测试驱动设计。这是在编写代码以使其满足要求之前编写单元测试的实践,即所谓的“红绿色重构周期”。

4
具有SQL和数据操作功能的TDD
当我是一名专业程序员时,我从未接受过软件工程方面的正式培训。由于我经常在这里访问,所以我注意到了尽可能编写单元测试的趋势,并且随着我的软件变得越来越复杂,我认为自动化测试是帮助调试的一个好主意。 但是,我的大部分工作涉及编写复杂的SQL,然后以某种方式处理输出。例如,您将如何编写测试以确保SQL返回正确的数据?然后,假设如果数据不受您的控制(例如,第三方系统的数据),那么您如何能有效地测试您的处理例程,而不必手写大量的伪数据? 我能想到的最佳解决方案是对涵盖大多数情况的数据进行查看。然后,我可以将这些视图与SQL连接起来,以查看它是否返回正确的记录,并手动处理视图以查看我的函数等是否正在执行应有的功能。尽管如此,它似乎过于油腻和胡扯。特别是找到要测试的数据...

5
遵循TDD是否不可避免地导致DI?
我学会了同时进行测试驱动开发(TDD),依赖注入(DI)和控制反转(IoC)。当我使用TDD编写代码时,我总是最终在类的构造函数中使用DI。我想知道这是因为我学会了如何进行TDD,还是这是TDD的自然副作用。 所以我的问题是:遵循TDD原理和编写不依赖外部服务的单元测试是否不可避免地导致DI?

9
TDD:我做对了吗?
我是一名新程序员(只学习了大约一年),为了达到更好的目标,我最近才了解TDD。我想养成使用它的习惯,因为它似乎很有帮助。我想检查并确保正确使用它。 我在做什么: 想一想我需要的一种新方法。 为该方法创建一个测试。 失败测试。 写方法。 通过测试。 重构方法。 重复。 我正在为我编写的每种方法执行此操作,是否有一些我不应该使用的方法?后来,我通常会想到一种以不同的方式或情况测试我现有方法的方法。我应该进行我想到的这些新测试,还是由于每种方法已经具有自己的测试,我不应该打扰吗?我可以对我的代码进行过度测试,我想这是我主要的担忧。 编辑 另外,我只是想知道这件事。当做类似GUI的事情时,在那种情况下TDD是必要的吗?就个人而言,我想不出该如何编写测试。
14 tdd 

3
单元测试的正交性与单元测试的简洁性
我正在为视频游戏的转向系统编写单元测试。系统具有多种行为(由于原因A避免了该区域,由于原因B避免了该区域,每个行为都向该区域的地图添加了一些上下文。然后,一个单独的函数解析该地图并产生所需的运动。 我在决定如何编写行为的单元测试时遇到了麻烦。正如TDD所建议的,我只对行为如何影响所需的运动感兴趣。例如,避免-原因-A会导致移动远离建议的不良位置。我实际上并不在乎行为如何或为何为地图添加上下文,仅是所需的运动远离该位置。 因此,我对每种行为的测试都建立了行为,将其写入地图,然后执行地图解析功能来计算出所需的动作。如果该运动满足我的要求,那么我很高兴。 但是,现在我的测试取决于行为是否正常运行以及映射解析功能是否正常运行。如果解析功能失败,那么我将获得数百个失败的测试,而不是几个。许多测试写作指南都建议这是一个坏主意。 但是,如果我通过模拟映射直接针对行为的输出进行测试,那么我肯定与实现紧密结合了吗?如果我可以通过使用稍微不同的行为从地图上获得相同的期望运动,则测试应该仍然可以通过。 所以现在我正遭受认知失调。构造这些测试的最佳方法是什么?
14 tdd  unit-testing 

6
寻找有关TDD如何改善质量和/或开发速度的案例研究[关闭]
关闭。这个问题是题外话。它当前不接受答案。 想改善这个问题吗? 更新问题,以使它成为软件工程堆栈交换的主题。 6年前关闭。 在我的公司中,我正在努力说明为什么我们应该进行TDD。当前,大多数开发人员会尽其所能完成项目,然后在事实发生后添加单元测试,以满足经理的要求。来自开展TDD并看到收益的知名公司的任何示例将不胜感激。
14 tdd 

4
什么时候应该使用模拟对象?
我已经阅读了很多有关TDD的内容,但是我仍然有疑问。例如,我有以下类图: 这是一个简单的示例,仅用于了解TDD和模拟对象。 我应该先写哪个测试?产品,然后行,最后,订购?如果这样做,我应该使用生产线和产品来测试订单还是应该使用模拟对象?我什么时候应该使用模拟对象?我应该在XP和TDD中使用UML吗? 我还没有这些东西。

3
TDD用于批处理:如何做?
我喜欢RoR等的“红色/绿色/重构”等。 我的日常工作涉及使用python和其他自定义工具批量处理来自第三方的超大文件。 这些文件的属性的流失率很高,因此很多修正/增强功能都经常被应用。 不存在通过具有预期结果的已知测试数据进行回归测试。最近的事情是对最后一批进行手工编码的新测试用例运行,请确保它不会爆炸,然后应用抽查和统计测试来查看数据是否仍然正常。 问>>如何将TDD原理引入这种环境?
14 testing  tdd 

4
重新设计时,如何有效地保持测试工作?
一个经过良好测试的代码库有很多好处,但是测试系统的某些方面会导致代码库可以抵抗某些类型的更改。 一个示例是测试特定的输出-例如文本或HTML。通常(天真吗?)编写测试以期望将特定文本块作为某些输入参数的输出,或者在块中搜索特定部分。 更改代码的行为以满足新的要求,或者由于可用性测试导致了界面的更改,因此也需要更改测试,甚至可能不是针对更改代码的特定单元测试的测试。 您如何管理查找和重写这些测试的工作?如果您不能只是“全部运行并让框架将它们整理出来”怎么办? 还有哪些其他类型的被测代码会导致习惯性的易碎测试?

1
如何对图像处理代码进行单元测试?
我正在图像处理(主要是OCR)方面工作,我想知道如何在开发中集成单元测试。 我已经在使用单元测试来处理更多“常见”类型的代码,但是在处理图像处理代码时,我不确定该如何处理。这种代码总是需要一些图像数据输入/输出,而对其进行模拟并不明显。目前,我主要进行集成测试,但是它们需要一段时间才能运行,我想了解一些有关如何将这种代码分解为单元测试的想法,以便我可以更快地运行它们。 编辑:分析角色可以经历许多步骤,包括多次旋转,缩放和形态操作。随着算法的发展,这些步骤经常改变。因此,在测试期间,输入和预期输出会发生很大变化。每个字符可以为100x100像素,因此毫无疑问地在代码中对它们进行编码或处理生成的数据。

4
您如何才能对只能修复的bug进行TDD测试?
这是一个示例:我的Web应用程序包含可拖动元素。拖动元素时,浏览器会生成“重影”。我想在拖动时删除“重影”,并为此测试编写了一个测试。 我的问题是,我最初不知道如何解决此错误,而编写测试的唯一方法是在修复它之后。 在诸如之类的简单函数中let sum = (a, b) => a - b,您可以在编写任何代码之前编写一个关于为什么sum(1, 2)不相等的测试3。 在我描述的情况下,我无法测试,因为我不知道验证是什么(我不知道断言应该是什么)。 所描述问题的解决方案是: let dataTransfer = e.dataTransfer let canvas = document.createElement('canvas'); canvas.style.opacity = '0'; canvas.style.position = 'absolute'; canvas.style.top = '-1000px'; dataTransfer.effectAllowed = 'none'; document.body.appendChild(canvas); dataTransfer.setDragImage(canvas, 0, 0); 我不知道这是解决方案。在网上找到解决方案后,我什至无法编写测试,因为我唯一可以知道它是否真正有效的方法就是将这段代码添加到我的代码库中,并通过浏览器进行验证是否达到预期的效果。测试必须在代码之后编写,这与TDD背道而驰。 TDD如何解决此问题?在代码之前编写测试是强制性还是可选的?

1
TDD方法可以自上而下应用吗?
我不清楚TDD(该方法论)如何处理以下情况。假设我想在Python中实现mergesort算法。我首先写 assert mergesort([]) === [] 并且测试失败 NameError:未定义名称“ mergesort” 然后我添加 def mergesort(a): return [] 我的测试通过了。接下来我添加 assert mergesort[5] == 5 我的测试失败了 断言错误 我通过 def mergesort(a): if not a: return [] else: return a 接下来,我添加 assert mergesort([10, 30, 20]) == [10, 20, 30] 现在我必须尝试通过此步骤。我“知道” mergesort算法,所以我这样写: def mergesort(a): if not a: return [] else: …
13 tdd 

3
何时给定(GWT)和行为安排断言(AAA)之间的区别?
在TDD中,有Arrange Act Assert(AAA)语法: [Test] public void Test_ReturnItemForRefund_ReturnsStockOfBlackSweatersAsTwo_WhenOneInStockAndOneIsReturned() { //Arrange ShopStock shopStock = new ShopStock(); Item blackSweater = new Item("ID: 25"); shopStock.AddStock(blackSweater); int expectedResult = 2; Item blackSweaterToReturn = new Item("ID: 25"); //Act shopStock.ReturnItemForRefund(blackSweaterToReturn); int actualResult = shopStock.GetStock("ID: 25"); //Assert Assert.AreEqual(expectedResult, actualResult); } 在BDD中,编写测试使用类似的结构,但语法为“当下(GWT)”: [Given(@"a customer previously bought a black sweater …
13 c#  unit-testing  tdd  bdd 

1
游戏测试策略
我继承了一个基于网络的教育游戏。在过去的一年中,我一直致力于稳定代码和添加新功能。大多数逻辑都在前端,因此后端单元测试虽然很有用,但只覆盖了一小部分代码。 游戏已经到了开始变得复杂的地步。每个游戏有两种不同的模式,并且游戏的行为取决于模式。还有各种影响游戏玩法的标志。 我担任应用程序开发人员已有10多年了,这使我感到困惑。在企业界,算法始终以相同的方式起作用。我将为算法编写一个单元测试,我期望值42,如果我没有得到该值,它将出错。 说到游戏,我迷路了。我该如何测试?我有可用的测试仪。我可以花时间编写单元测试。 测试人员...不可靠。他们不是最能根除问题的人,我也没有给他们最好的方向。在每个发行周期花大量时间测试游戏的每个排列和组合时,我应该如何将它们用作资源? 单元测试似乎很有限。由于大多数逻辑是javascript(并且我继承了意大利面条代码),因此我可以使用诸如Cucumber或selenium之类的前端套件来确保某些功能正常工作。 那是最好的策略吗?游戏公司如何测试游戏? 我已经读过“ 复杂游戏的测试驱动开发 ”(以及网站上的其他问题)的问题,但是它没有解决我所寻找的问题。我要的是策略,而不是具体的测试示例。

5
根据有用性进行单元测试的类型
从价值的角度来看,我在实践中看到两组单元测试: 测试一些非平凡逻辑的测试。(在实现之前或之后)编写它们会发现一些问题/潜在错误,并有助于您确定将来逻辑发生变化时的情况。 测试一些非常琐碎的逻辑的测试。这些测试比测试代码更像文档代码(通常带有模拟)。这些测试的维护工作流不是“某些逻辑改变了,测试变成了红色-感谢上帝,我编写了这个测试”,而是“一些琐碎的代码改变了,测试变成了假否定-我必须维护(重写)该测试而没有获得任何收益” 。在大多数情况下,这些测试不值得维护(出于宗教原因除外)。根据我在许多系统中的经验,这些测试占所有测试的80%。 我正在尝试找出其他人对单元测试按值分离以及如何与我的分离相对应的想法。但是我最常看到的是全职TDD宣传或测试都是无用的,只是编写代码宣传。我对中间的东西感兴趣。欢迎您发表自己的想法或参考文章/论文/书籍。
13 unit-testing  tdd 

2
从被测系统中提取类时,应该重构单元测试吗?
我写的这个类做了几件事(也许这违反了单一责任原则)。我现在该项目的其他部分需要意识到一块是逻辑的,我要揭露它是提取的一类了我原来的被测系统的方式。 我期望无需更改任何测试代码即可执行此操作,但是当我完成操作时,您可能会说该测试不再是单元测试。它将测试原始类和我提取的类。换句话说,我将有一个测试用例,但有两个系统正在测试中。 完成后是否应该重构测试代码?IE:创建一个ExtractedClassTest并将所有相关测试从OriginalClassTest移入其中?这似乎有点冒险:我可能会在此过程中失去一些覆盖面,它可能不像移动测试那样简单,并且我最终会重写一些我知道曾经可以使用但无法再使用的测试代码,等等 另一方面,如果按原样保留OriginalClassTest,则可以看到这是测试维护问题。找到ExtractedClass的测试在哪里会有些混乱。您的第一印象将是它不存在。随着时间的推移,随着大量生产代码的重构,这可能会成为一个严重的问题。 我是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.