Questions tagged «tdd»

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

3
使用模板时,如何处理越来越长的编译时间?
我使用Visual Studio 2012,在某些情况下,我们将模板参数添加到“ just”类中​​以引入“接缝点”,以便在单元测试中可以将这些部分替换为模拟对象。 您通常如何在C ++中引入接缝点:使用接口和/或通过使用模板参数,还基于某些条件与隐式接口进行混合?提出此问题的原因之一还在于,当有时编译单个C ++文件(包括模板文件,还可能包括其他模板)时,会导致在开发人员机器上生成大约5-10秒的目标文件。 。 据我所知,由于模板包含模型,VS编译器在编译模板方面也不是特别快(实际上,您在每个间接使用它的文件中都包含了模板的定义,并且每次修改时都可能重新实例化该模板)与模板无关的内容)(在进行增量编译时),编译时间可能会出现问题。 使用模板时,处理增量(且不仅是)编译时间的方法是什么(除了更好/更快的编译器:-)外)。
13 c++  tdd  templates 

1
包装第三方代码是否是对用户进行单元测试的唯一解决方案?
我正在进行单元测试,并且在我的一个类中,我需要从一种方法中发送邮件,因此使用构造函数注入,我将注入Zend_MailZend框架中的类的实例。 现在有人认为,如果一个库足够稳定并且不会经常更改,那么就无需对其进行包装。因此,假设这Zend_Mail是稳定的并且不会改变并且完全满足我的需求,那么我就不需要包装器了。 现在看一下我的课程Logger,该课程取决于Zend_Mail: class Logger{ private $mailer; function __construct(Zend_Mail $mail){ $this->mail=$mail; } function toBeTestedFunction(){ //Some code $this->mail->setTo('some value'); $this->mail->setSubject('some value'); $this->mail->setBody('some value'); $this->mail->send(); //Some } } 但是,单元测试要求我一次测试一个组件,因此我需要模拟Zend_Mail该类。另外,我违反了依赖倒置原则,因为我的Logger课程现在依赖于具体而非抽象。 现在,我如何Logger在不进行包装的情况下进行隔离测试Zend_Mail? 该代码在PHP中,但不一定必须提供答案。这更多的是设计问题,而不是特定于语言的功能

3
如何对音频进行单元测试?
我已经继承了一个小项目,并希望通过为要添加的所有新代码编写单元测试来扩展并稳定它。第一类TypedAudioCreator创建音频文件,事实证明,这很容易首先进行测试,然后编写代码。 但是,到了编写的时间TypedAudioPlayer,我不知道该如何测试。这是一门很小的课程,专注于播放声音的基础知识: public class TypedAudioFilePlayer { public event StartedPlayingHandler StartedPlaying; public event StoppedPlayingHandler StoppedPlaying; public readonly int TimeBetweenPlays; private Queue<TypedAudioFile> _playlist = new Queue<TypedAudioFile>(); public TypedAudioFilePlayer(int timeBetweenPlays) { TimeBetweenPlays = timeBetweenPlays; } public void AddFile(TypedAudioFile file) { _playlist.Enqueue(file); } public void StartPlaying() { ThreadPool.QueueUserWorkItem(ignoredState => { while (_playlist.Count > 0) …
13 c#  tdd 

5
TDD,新测试,旧测试尚未实施
我正在试验测试驱动的开发,发现经常遇到以下情况: 我为某些功能X编写测试。这些测试失败。 在尝试实现X时,我看到我需要在代码的下层实现某些功能Y。所以... 我为Y编写测试。现在针对X和Y的测试均失败。 一旦我同时处理了不同代码层中的4个功能,我就失去了对实际工作的关注(太多的测试同时失败)。 我认为即使在开始编写测试之前,也可以通过更加努力地计划任务来解决此问题。但是在某些情况下,我不知道需要更深入地研究,因为例如,我不太了解底层API。 在这种情况下我该怎么办?TDD有什么建议吗?

2
静态是不好的,但是工厂模式呢?
我正在进行TDD项目,所以我尝试尽可能地坚持与这种开发相关的良好实践。其中之一是尽可能避免静态和全局。 我面临着这个问题:我有一个对象“文章”,可以将其链接到“选项”(附加的“微型文章”)。 我无法弄清楚如何拥有一种不会产生反效果或产生过多查询的好的方法,因为我将处于一种一切都分离的情况下,我基本上将需要对每个对象进行一次查询。 从我的实际角度来看,我看到3个选项: 1)构建内部文章: class Article { //[...] public function getArrOption(){ //Build an array of Options instance. //return an array of Options. } } 优点:直截了当 const:可维护性:article对象现在包含Option对象的构建逻辑。这可能会导致代码重复。 2)使用optionFactory class Article { //[...] public function getArrOption(){ return OptionFactory::buildFromArticleId($this->getId()); } } 优点:构建逻辑并非超出Article类 const:我违反了“静态很难模拟”的规则,这使得我的Article类很难测试。 3)分离所有逻辑。 //Build the array of Option instance in a …
13 php  tdd  static-access 

7
资源有限的TDD
我在一家大公司工作,但仅用两个人的团队来开发桌面LOB应用程序。我已经研究TDD已有很长时间了,尽管很容易实现其在大型应用程序中的好处,但我很难尝试证明在我们的应用程序规模上开始使用TDD的时间。 我了解它在自动化测试,提高可维护性等方面的优势,但就我们的规模而言,即使为我们所有组件编写基本的单元测试也很容易使开发时间加倍。由于我们已经没有足够的时间来完成最后的任务,所以我不确定该朝哪个方向前进。从那时起,敏捷迭代开发之类的其他实践就完美了,但我对小型团队中TDD的生产率权衡感到有些沮丧。 TDD的优势是否值得在时间表非常紧凑的小型团队上花费额外的开发时间?
13 tdd 

4
当TDD测试显示需要进行测试的新功能时该怎么办?
当您编写测试并达到需要通过测试并意识到需要附加功能的时候,该怎么做?该新功能也需要进行测试,但是TDD周期表示“使测试失败,使其通过然后进行重构”。如果我要通过测试,那我就不应该继续进行另一个失败的测试来测试我需要实现的新功能。 例如,我正在编写一个具有函数WillCollideWith(LineSegment)的点类: public class Point { // Point data and constructor ... public bool CollidesWithLine(LineSegment lineSegment) { Vector PointEndOfMovement = new Vector(Position.X + Velocity.X, Position.Y + Velocity.Y); LineSegment pointPath = new LineSegment(Position, PointEndOfMovement); if (lineSegment.Intersects(pointPath)) return true; return false; } } 当我意识到我需要LineSegment.Intersects(LineSegment)函数时,我正在为CollidesWithLine编写测试。但是,我是否应该停止测试周期中的工作以创建此新功能?这似乎违反了“红色,绿色,重构”原则。 我是否应该只编写检测到lineSegments在CollidesWithLine函数内部相交并在工作后对其进行重构的代码?在这种情况下,这是可行的,因为我可以从LineSegment访问数据,但是如果这种数据是私有的,那该怎么办?
13 unit-testing  tdd 

2
您如何对ETL和报告项目进行单元测试\使用TDD方法?
ETL项目是使用诸如SSIS,PowerCenter等ETL(提取-转换-加载)工具创建的项目。 这些通常涉及从外部源读取数据,将其加载到暂存数据库,执行某些转换并将其加载到最终数据库。 一个简单的例子是使用SSIS来读取教师使用SSIS提供的excel文件并将其加载到数据库中。然后编写存储过程或更多SSIS包以计算每个学生的成绩并将该数据加载到数据集市\仓库中 然后,您在集市上构建存储过程以生成输出,报告工具(SSRS \ Excel \ etc)使用该输出来生成可视化。 我试图了解在这种情况下如何执行TDD和适当的单元测试。ETL的测试主要是确保登台表中加载的数据与源中数据的正确子集匹配。因此,对其进行测试将导致实现ETL的迷你版本。报告SP的输出取决于表本身中的数据,因此即使没有创建包含清理的测试数据的数据库,也没有维护的噩梦就无法拥有稳定的输出数据集。 例: 冲刺1:学生表包含姓名,年龄,年级 您为此表创建测试数据,并基于该表进行单元测试 冲刺2:性别字段添加到表中。 现在,如果刷新学生字段中的数据以填充性别属性,则由于数据已更改,因此测试用例将无效。如果您不这样做,就无法创建需要性别列的测试用例
12 unit-testing  sql  tdd 

4
如何使用TDD获得正确的初始API?
这可能是一个很愚蠢的问题,因为我是第一次尝试TDD。我喜欢它带来的信心以及代码的总体上更好的结构,但是当我开始将其应用于比一类玩具示例更大的东西时,我遇到了困难。 假设您正在编写各种各样的库。您知道它必须要做的事情,您知道应该如何实现它的一般方法(从体系结构角度来说),但是您不断“发现”需要在编写代码时对公共API进行更改。也许您需要将此私有方法转换为策略模式(现在需要在测试中通过模拟的策略),也许您错失了职责,并拆分了一个现有的类。 当您在现有代码上进行改进时,TDD似乎非常合适,但是当您从头开始编写所有内容时,除非您进行了较大的设计,否则编写测试的API有点“模糊”。当您已经对该签名进行了30次测试的方法(对于该部分而言,其行为)更改时,该怎么办?一旦合并起来,有很多测试需要更改。
12 tdd 

3
如何TDD返回正确的结果
我正在开始一个新项目,并非常非常努力地使用TDD来驱动设计。我已经努力了很多年,终于获得批准,可以花更多的时间在这个项目上使用它,同时我会学习如何正确地做。 这是一个新模块,可以绑定到现有系统中。当前,所有数据访问都通过Web服务进行,Web服务在大多数情况下只是数据库存储过程的一个精简包装。 一个要求是,对于给定的商店,我将退回所有被认为对该应用程序有效的采购订单。如果PO的发货日期在商店开业日期的指定范围内(对于新商店),则认为该PO有效。 现在,我不能在应用程序代码中放入此逻辑,因为鉴于上述限制,我不会带回一百万个PO,只是为了使适用于该商店的十二个PO可以应用到该商店。 我当时在想,我可以将日期范围传递给GetValidPOs proc,并使用这些值返回有效的PO。但是,如果我们在被认为是有效的采购订单中添加了另一个要求,该怎么办? 以及如何测试并验证其是否正常运行?我们没有使用ORM,并且不太可能发生。而且我无法在测试中调用数据库。 我被卡住了。 我的另一个想法是,有一些模拟返回有效数据,其他模拟返回一些不良数据,并让本地存储库在发生不良数据时引发异常,并测试如果GetValidPOs proc返回无效数据,则引发异常测试中使用的模拟)。 这有意义吗?或者,还有更好的方法? 更新: 看起来我可以使用EF。现在,我只需要弄清楚如何使用它,并使它可测试,同时仍然能够依赖存储过程,以及使数据分散在多个数据库中的困难。

4
是否可以介绍仅在单元测试期间使用的方法?
最近,我正在开发一种工厂方法。该方法是创建一个普通对象或包装在装饰器中的对象。装饰对象可以是全部扩展StrategyClass的几种类型之一。 在测试中,我想检查返回对象的类是否符合预期。当普通对象os返回时,这很容易,但是将其包装在装饰器中怎么办? 我使用PHP编写代码,因此可以ext/Reflection用来找出一类包装对象,但是在我看来,这似乎使事情变得过于复杂,并且有点像TDD的规则。 相反,我决定引入getClassName()从StrategyClass调用时将返回对象的类名的方法。但是,当从装饰器调用时,它将返回装饰对象中相同方法返回的值。 一些代码使其更清晰: interface StrategyInterface { public function getClassName(); } abstract class StrategyClass implements StrategyInterface { public function getClassName() { return \get_class($this); } } abstract class StrategyDecorator implements StrategyInterface { private $decorated; public function __construct(StrategyClass $decorated) { $this->decorated = $decorated; } public function getClassName() { return $this->decorated->getClassName(); } …
12 php  tdd 


6
测试驱动的开发-谁应该编写测试?
最初,开发人员有责任编写测试,但我注意到,在许多情况下/成熟的开发人员中,这些情况甚至没有提供80%的覆盖率。 我有一个质量保证人员专门为给定项目而不是开发人员编写所有测试的情况如何? 有什么缺点吗?

2
测试-内存中数据库与模拟
在编写测试时,为什么有人要使用内存数据库来模拟数据呢? 我可以看到内存数据库对于测试一个人的存储库可能是有益的。但是,如果使用框架(例如Spring Data),则测试存储库将测试框架,而不是测试应用程序逻辑。 但是,模拟似乎更快,并且遵循编写单元测试和TDD时通常采用的相同模式。 那我想念什么呢?何时/为什么内存数据库会受益?

2
TDD在协作开源项目中是否可行
假设我想启动一个开源项目,希望/期望有很多人提交补丁,什么也没做。采取严格的TDD方法是否可行?我可以/应该/希望协作者在提交补丁时编写质量测试吗? 我一直在考虑的一件事是为单个错误报告和功能请求编写测试套件,并要求所有修补程序/拉动请求都使测试通过,但是到那时看来,编写功能/错误修复似乎会更好我。 据我所知,大多数使用TDD(或至少编写测试)的主要开放源代码项目似乎大多是纯粹由个人或团队编写的,在其中很容易实施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.