Questions tagged «tdd»

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

9
断言代码太多了吗?
我真的爱上了单元测试和TDD-我被测试感染了。 但是,单元测试通常用于公共方法。有时候,尽管我确实也必须在私有方法中测试一些假设-断言,因为其中一些是“危险的”,并且重构无济于事。(我知道,测试框架允许测试私有方法)。 因此,我的习惯是私有方法的第一行和最后一行都是断言。 但是,我注意到我倾向于“肯定”地在公共方法(以及私有方法)中使用断言。因为公共方法假设是由单元测试框架从外部进行测试的,所以这可能是“测试重复”吗? 有人会认为太多的断言是代码的味道吗?

7
抽象是否必须降低代码的可读性?
最近与我合作的一名优秀开发人员告诉我,他在实现我们继承的某些代码中的功能时遇到了一些困难;他说,问题在于该代码难以遵循。由此,我对产品进行了更深入的了解,并意识到查看代码路径有多么困难。 它使用了许多接口和抽象层,以致于很难理解事物的开始和结束位置。这让我开始思考过去的项目的时间(在我很清楚干净的代码原理之前),发现在项目中走来走去非常困难,这主要是因为我的代码导航工具总是使我进入一个界面。找到具体的实现或某些插件类型体系结构中的连接位置将花费大量的额外精力。 我知道有些开发人员正是出于这个原因严格拒绝依赖注入容器。它极大地混淆了软件的路径,以致代码导航的难度成倍增加。 我的问题是:当框架或模式引入如此多的开销时,是否值得?这是模式实施不当的征兆吗? 我想开发人员应该从更大的角度看待抽象带给项目的东西,以帮助他们度过沮丧。通常,尽管如此,很难使他们看到大局。我知道我未能通过TDD出售IOC和DI的需求。对于那些开发人员而言,使用这些工具只会严重限制代码的可读性。

8
有什么好的单元测试来覆盖滚动模具的用例?
我正在努力掌握单元测试。 假设我们有一个模具,其默认面数可以等于6(但可以是4、5面,等等): import random class Die(): def __init__(self, sides=6): self._sides = sides def roll(self): return random.randint(1, self._sides) 以下是有效/有用的单元测试吗? 测试6面模具的1-6范围内的辊 测试6面模具的0卷 测试6面模具的7卷 测试3面模具的1-3范围内的辊 测试3面模具的0卷 测试一卷4的3面模具 我只是认为这些都是浪费时间,因为随机模块已经存在了很长时间,但是我认为如果随机模块得到更新(比如我更新了我的Python版本),那么至少我会被覆盖。 另外,在这种情况下,我是否还需要测试模具辊的其他变化,例如3,还是覆盖另一个已初始化的模具状态好吗?

5
TDD测试应该有多精细?
在基于医疗软件案例的TDD培训期间,我们实现了以下故事:“当用户按下保存按钮时,系统应添加患者,添加设备并添加设备数据记录”。 最终的实现将如下所示: if (_importDialog.Show() == ImportDialogResult.SaveButtonIsPressed) { AddPatient(); AddDevice(); AddDeviceDataRecords(); } 我们有两种方法可以实现它: 调用了三个测试,每个测试都验证一个方法(AddPatient,AddDevice,AddDeviceDataRecords) 一种验证所有三种方法的测试称为 在第一种情况下,如果if子句条件发生错误,则所有三个测试均将失败。但是在第二种情况下,如果测试失败,我们不确定到底是什么错误。您会选择哪种方式。
18 unit-testing  tdd 

6
TDD和完整的测试范围,需要指数测试用例
我正在研究一个列表比较器,以帮助根据客户的非常特定的要求对搜索结果的无序列表进行排序。需求要求使用重要性规则按以下规则排序相关性算法: 姓名完全匹配 搜索词中所有单词的名称或结果的同义词 搜索查询中某些单词的名称或结果的同义词(%降序) 说明中搜索查询的所有单词 说明中搜索查询的某些单词(降序排列) 最后修改日期降序 该比较器的自然设计选择似乎是基于2的幂的得分排名。次要重要规则的总和永远不会与重要性较高的规则的正比匹配大。这可以通过以下得分来实现: 32 16 8(基于决断百分比下降的次决胜局得分) 4 2(基于降低百分比的次决胜局得分) 1个 本着TDD的精神,我决定首先进行单元测试。对于每个唯一方案都有一个测试用例,至少要有63个唯一测试用例,而不考虑规则3和5上的辅助抢断逻辑的其他测试用例。这似乎太过分了。 实际的测试实际上会更少。根据实际规则本身,某些规则可确保较低的规则将始终为真(例如,当“所有搜索查询词都出现在说明中”时,规则“某些搜索查询词会出现在说明中”将始终为真)。写下每个测试用例的努力水平仍然值得吗?在谈论TDD中100%的测试覆盖率时,这通常是要求的测试级别吗?如果不是,那么什么是可接受的替代测试策略?

1
是否可以使用Jester for Java这样的变异测试工具替代现代产品?
“为什么您可以肯定地知道为什么您的测试很好呢?有时Jester告诉我我的测试是密闭的,但是有时发现的变化却是突然的。强烈推荐。”-肯特·贝克(Kent Beck) 但是我看到在stackoverflow中甚至没有一个名为“ Jester ” 的标签。那么,对于Jester的现代替代品是什么?除了从Cobertura和Clover等工具的代码覆盖范围中找到统计信息之外,如何确保编写的单元测试牢不可破?

3
如何测试数据访问层?
我有一个DAO方法,该方法利用Spring进行JDBC访问。它计算出卖家出售商品的成功率。 这是代码: public BigDecimal getSellingSuccessRate(long seller_id) { String sql = "SELECT SUM(IF(sold_price IS NOT NULL, 1, 0))/SUM(1) FROM transaction WHERE seller_id = ?"; Object[] args = {seller_id}; return getJdbcTemplate().queryForObject(sql, args, BigDecimal.class); } 我应该如何使用JUnit测试此方法或任何DAO方法?有哪些最佳实践来测试数据访问逻辑?我正在考虑针对加载了一些数据的可嵌入数据库进行测试,但是就RDBMS和架构而言,我们不应该进行类似于生产环境的集成测试吗?

3
使用TDD和良好的测试覆盖率编写的应用程序的真实示例?[关闭]
关闭。这个问题是题外话。它当前不接受答案。 想改善这个问题吗? 更新问题,使它成为软件工程堆栈交换的主题。 6年前关闭。 是否有任何使用测试驱动的开发开发的开源应用程序可以作为良好的单元测试应该如何工作的模型? 我更喜欢在C#和.NET中查看示例。(请注意,我提到的是应用程序,而不仅仅是库。) 我是一个中层程序员,他真的想相信并实践TDD。我在日常工作中使用的应用程序非常复杂-大约一百万行代码-我很想介绍更多的单元测试。我们已经进行了一些单元测试,但是我在TDD上所做的工作以及已经在测试中的代码的工作都没有令人鼓舞。 以我公认的有限经验,TDD似乎以去耦的名义鼓励了很多复杂性。应用程序中难以测试的部分(巧合地往往很关键)被推向外围,进入了可能会或可能永远不会编写的集成测试领域。(我在这里想到了通常的可疑对象,文件系统访问,从数据库中添加对象,异步Web调用等) 被测试的代码往往涉及对象之间的大量协作,也许还涉及一些简单的流逻辑,所有这些都发生在内存中,并且如果不必完全分离所有对象,则可以用更简单,更易理解的方式编写供测试用。 我了解模拟依赖项等的技巧,但是根据我的经验,大量使用模拟会导致非常脆弱的测试。如果我看到许多测试变成红色的第一个直觉是:“好,现在我必须修复所有模拟程序”,那么我的测试就成了阻力,而不是安全网。 我正在努力克服这一精神障碍,在其中,我正在阅读Michael Feathers的书《有效地使用Legacy Code》。我希望它能告诉我一些我所缺少的东西。 我还想研究一些具有良好代码覆盖率的.NET应用程序,例如内容管理系统或CRUD应用程序。Bob叔叔谈论的FitNesse测试框架是我可能要看的东西,但是很高兴看到用我最熟悉的语言编写的东西。 任何建议或智慧的话,将不胜感激。
17 unit-testing  tdd 

8
如何在嵌入式设备上进行TDD?
我对编程并不陌生,甚至在AVR上使用过一些低级C和ASM,但我确实无法涉足更大规模的嵌入式C项目。 由于Ruby的TDD / BDD理念退化,我无法理解人们是如何编写和测试这样的代码的。我并不是说这是一个不好的代码,我只是不明白这是如何工作的。 我想更多地参与一些底层编程,但是我真的不知道该如何处理,因为它看起来就像是我习惯的完全不同的思维方式。我在理解指针算术或分配内存的方式方面没有问题,但是当我看到与Ruby相比C / C ++代码看起来多么复杂时,这似乎很难。 由于我已经为自己订购了Arduino开发板,所以我很想深入了解一些低级C并真正了解如何正确地做事,但是似乎高级语言的规则都不适用。 甚至有可能在嵌入式设备上或在开发驱动程序或自定义引导加载程序之类的东西时进行TDD吗?

6
TDD:在第一次单元测试之前会发生什么?
我最了解TDD的理论,但我不知道如何开始。我坐下来为个人项目编写单元测试并意识到这一点。。。我不知道我要测试什么。什么对象,什么功能等 例如,假设我想编写一个应用程序来帮助我们的家人管理杂务。我想到了一些问题:如何从这个想法开始进行第一次测试?开始之前应该确定多少?开始编写测试后应该确定多少?什么时候做出诸如将数据存储在文本文件还是数据库中的决定?开始之前是否应该进行用户接受度测试?我应该设计UI吗?我应该有规格吗?(我确实意识到这些示例问题中至少有一些可能在“灰色区域”中)。 除了有关进行第一个单元测试的标题问题之外,您还可以举一个例子说明一个示例项目的项目的第一个单元测试是什么样的吗?
17 design  tdd 

7
在将团队转换为TDD以实现全面覆盖之后,编写所有可能的测试用例是一个好主意吗?
假设我们有一个大型企业级应用程序,而没有任何单元/功能测试。由于非常紧迫的期限,因此在开发过程中没有测试驱动的开发过程(我知道我们永远不能在不确定的情况下承诺任何紧迫的期限,但是已经完成了!) 既然所有的截止日期都过去了,事情变得平静了,每个人都同意将我们转变成一个富有成效的基于TDD / BDD的团队...是的! 现在的问题是关于我们已经拥有的代码:(1)停止大多数开发并从头开始编写所有可能的测试用例还是可以的,尽管一切都可以很好地进行(尽管!)。 ?或(2)最好等待一些不好的事情发生,然后在修复过程中编写新的单元测试,或者(3)甚至忘记以前的代码,而只为新代码编写单元测试,并将所有内容推迟到下一个主要重构中。 有几个好的,如相关的文章这一个。考虑到我们的时间非常有限,还有许多其他项目/作品正在等待我们,我仍然不确定是否值得为此进行投资。 注意:这个问题正在解释/想象开发团队中一个完全尴尬的情况。这与我或我的任何同事无关;这只是一个假想的情况。您可能会认为这种情况永远都不会发生,否则开发经理会造成这种混乱!但是无论如何,已经完成了。如果可能的话,请不要仅仅因为您认为这永远不会发生而投票。

5
在TDD中,如果我编写的测试用例在不修改生产代码的情况下通过了,那意味着什么?
这些是Robert C. Martin的TDD规则: 除非要通过失败的单元测试,否则不允许编写任何生产代码。 您不得编写任何足以使单元测试失败的单元测试。编译失败就是失败。 您不能编写任何足以通过一项失败的单元测试的生产代码。 当我编写一个看似值得但未更改生产代码的测试通过时: 这是否表示我做错了? 如果可以帮助,将来是否应该避免编写此类测试? 我应该将该测试留在那里还是将其删除? 注意: 我在这里试图问这个问题:我可以从通过单元测试开始吗? 但是直到现在我还不能很好地阐明这个问题。

6
从TDD的角度来看,如果我针对实时端点而不是模拟进行测试,那我是一个坏人吗?
我虔诚地遵循TDD。我的项目通常具有有意义的测试用例,测试覆盖率可达85%或更高。 我使用HBase进行了大量工作,而主要的客户端接口HTable实在令人难以接受。与编写使用实时端点的测试相比,编写我的单元测试要花3到4倍的时间。 从哲学上讲,我知道使用模拟的测试应优先于使用实时端点的测试。但是模拟HTable是一个严重的难题,我不确定它相对于针对实时HBase实例进行测试是否具有很多优势。 我们团队中的每个人都在其工作站上运行一个单节点HBase实例,而我们的Jenkins机器上运行着一个单节点HBase实例,因此这不是可用性问题。实时端点测试显然比使用模拟的测试花费更长的时间,但是我们并不在乎。 现在,我为我的所有类编写了实时端点测试和基于模拟的测试。我很想抛弃模拟游戏,但我不希望结果因此而下降。 你们怎么想

2
软件测试技术或类别
很难说出这里的要求。这个问题是模棱两可,含糊,不完整,过于宽泛或夸张的,不能以目前的形式合理地回答。如需帮助澄清此问题以便可以重新打开, 请访问帮助中心。 8年前关闭。 您知道哪种软件测试?我听说过测试驱动开发,单元测试等,但是不了解它们的重要性和差异。例如,为什么我们要使用回归测试或验收测试。他们提供什么优势?

10
在什么时候为了更多的钱而放弃一些软件开发原则?
我想把这个问题扔出去,有趣地看看介质在哪里。 我要承认,在过去的12个月中,我获得了TDD和软件开发中的许多敏捷价值。我对软件开发的进步感到不知所措,以至于我永远都不会放弃它们。直到...我被任命为承包人,这使我当年的实得工资翻了一番。 我加入的公司没有遵循任何特定的方法,团队还没有听说过代码气味,SOLID等问题,而且如果团队从未做到过,我当然也不会浪费时间进行TDD在实践中看到了单元测试。我卖完了吗?不,不是完全...代码将始终被“干净地”编写(按照Bob叔叔的教)),并且SOLID的原理将始终应用于需要的我编写的代码。尽管对我来说测试已经放弃了,但坦率地说,公司无法承担如此未知的任务,即使我确实创建了测试框架,他们也永远不会正确使用/维护测试框架。 以此为例,您会说开发人员出于金钱/个人其他利益而绝不放弃其工艺原则的观点?我了解这可能是一种非常个人的看法,即人们对自己的需求,业务需求以及工艺等方面的关注程度。但是,可以考虑,例如,如果公司决定宁愿进行测试,则可以放弃测试。测试团队,而不是理解编程中的单元测试,那会不会像我那样原谅自己?因此,考虑到您会丢掉一些东西,通常业务中应该有相等的成本来弥补您丢掉的东西-希望如此,除非您当然愿意掏腰包而不是依靠社区/社会合作; )。 加倍您的钱,回到RAD?或继续前进,寻找正在做敏捷的人,再也不回头...

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.