Questions tagged «unit-testing»

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

13
我们如何使单元测试快速运行?
在项目中,我们已经进行了将近一千次测试,并且人们花了很长时间才停止在进行检入之前运行它们的麻烦。充其量,他们运行与所更改代码段相关的测试,而最糟糕的是,它们仅在未经测试的情况下检入。 我认为这个问题是由于以下事实导致的:解决方案已增长到120个项目(我们通常会做很多较小的项目,这只是我们第二次正确进行TDD),并且构建+测试时间已增长到大约两三分钟在较小的机器上。 我们如何减少测试的运行时间?有技巧吗?假装更多?少假装?也许在运行所有测试时不应该自动运行较大的集成测试? 编辑:作为对几个答案的回应,我们已经使用CI和构建服务器,这就是我知道测试失败的方式。问题(实际上是一种症状)是我们不断收到有关构建失败的消息。大多数人会执行部分测试,但并非全部。关于测试,它们实际上做得很好,对所有东西都使用伪造品,根本没有IO。
40 c#  unit-testing  tdd  nunit 

3
实际上值得对API客户端进行单元测试吗?
这已经让我困扰了一段时间。实际上值得对API客户端进行单元测试吗? 假设您正在创建一个小类,以抽象化对petshop REST API的调用。petshop是一个非常简单的API,它具有一组基本方法: listProducts() getProductDetails(ProductID) addProduct(...) removeProduct(ProductID) 在测试时,我们必须创建一个模拟服务或模拟响应。但这似乎太过分了;我知道我们想确保我们的方法不会因拼写错误/语法错误而停止工作,但是由于我们正在编写调用远程方法的函数,然后又从这些远程方法创建虚假响应,因此看起来浪费了很多精力,而我们正在测试的是不可能真正失败的东西。更糟糕的是,如果更改远程方法,则在生产使用失败时,我们的单元测试将通过。 我很确定自己丢失了某些东西,或者棍子的末端错了,或者我没有看到树木的木头。有人可以让我走上正确的路吗?
38 unit-testing  api 

7
我应该对已知缺陷进行单元测试吗?
如果我的代码包含一个应该修复的已知缺陷,但尚未修复,并且不会在当前版本中修复,并且在可预见的将来可能不会修复,如果该缺陷中的某个单元测试失败,测试套件?如果添加单元测试,它将(显然)会失败,并且习惯于失败的测试似乎是个坏主意。另一方面,如果它是一个已知的缺陷,并且存在一个已知的失败案例,那么将其排除在测试套件之外似乎很奇怪,因为应该在某个时间点对其进行修复,并且该测试已经可以使用。
37 unit-testing  tdd 

7
在构造函数中使用“ new”总是不好吗?
我已经读到,在构造函数中使用“ new”(对于除简单值对象之外的任何其他对象)是一种不好的做法,因为它使单元测试变得不可能(因为这些协作者也需要创建并且不能被模拟)。由于我没有真正的单元测试经验,因此我试图收集一些我将首先学习的规则。另外,无论使用哪种语言,这是一条通常有效的规则吗?

7
在单元测试中使用空参数构造对象可以吗?
我开始为当前项目编写一些单元测试。我真的没有经验。我首先要完全“得到它”,所以我目前既不使用IoC框架也不使用模拟库。 我想知道在单元测试中向对象的构造函数提供空参数是否存在任何问题。让我提供一些示例代码: public class CarRadio {...} public class Motor { public void SetSpeed(float speed){...} } public class Car { public Car(CarRadio carRadio, Motor motor){...} } public class SpeedLimit { public bool IsViolatedBy(Car car){...} } 另一个Car Code Example(TM)仅简化为对该问题重要的部分。我现在写了一个类似这样的测试: public class SpeedLimitTest { public void TestSpeedLimit() { Motor motor = new Motor(); …

6
为什么不在语法级别测试语言是受支持的功能?
您可以找到无穷无尽的博客,文章和网站列表,这些列表可以宣传对单元代码进行单元测试的好处。几乎可以保证,为Java,C ++,C#和其他类型的语言编写编译器的开发人员使用单元测试来验证其工作。 那么,为什么在这些语言的语法中,尽管它很流行,却为什么缺少测试呢? 微软在C#中引入了LINQ,那么为什么他们也不能添加测试呢? 我并不是要预测这些语言的变化,而是要阐明为什么它们一开始就没有。 例如:我们知道您可以编写一个for没有该语句语法的循环for。您可以使用while或if/ goto语句。有人认为for声明更有效,并将其引入语言。 为什么测试没有遵循编程语言的相同演变?

7
单元测试新手团队需要进行单元测试
我正在与一个新的团队合作,该团队历来没有进行任何单元测试。我的目标是让团队最终采用TDD(测试驱动开发)作为自然过程。但是由于TDD对于非单元测试团队来说是一种根本性的转变,我想我应该从编码后编写单元测试开始。 有人遇到过类似情况吗?什么是让团队在未进行任何单元测试时对TDD感到满意的有效方法?分两步进行是否有意义?还是我们应该立即潜水并立即面对所有不断增长的痛苦? 编辑 只是为了澄清起见,团队中除我本人之外,没有任何人可以测试暴露/经验的任何单元。我们计划使用Visual Studio中内置的单元测试功能。
37 unit-testing  tdd 

12
“足够”多少代码覆盖率?
在我们的工作中,我们开始努力提高代码覆盖率,这让我开始思考...。多少代码覆盖率足够? 什么时候达到代码覆盖率递减的地步?良好的覆盖范围与不足之间的最佳结合点是什么?它是否因您正在制作的项目类型(例如WPF,WCF,Mobile,ASP.NET)而不同(这些是我们正在编写的C#类)。

6
单元测试和数据库:实际上我应该在哪一点连接到数据库?
对于如何连接到数据库的测试类,例如“应该服务测试类如何连接...”和“单元测试-数据库耦合应用程序”,存在一个问题的答案。 因此,简而言之,假设您有一个需要连接到数据库的类A。您不给A实际连接,而是给A提供了A可以用来连接的接口。为了进行测试,您需要使用一些东西来实现此接口-当然不需要连接。如果类B实例化A,则必须将“真实”数据库连接传递给A。但这意味着B打开数据库连接。这意味着要测试B,您需要将连接注入B。但是B是在类C中实例化的,依此类推。 因此,在什么时候我必须说“在这里,我从数据库中获取数据,而我不会为这段代码编写单元测试”? 换句话说:我必须调用某个类的代码中的某个地方sqlDB.connect()或类似的地方。我如何测试这堂课? 并且与必须处理GUI或文件系统的代码是否相同? 我想做单元测试。任何其他类型的测试都与我的问题无关。我知道我只会用它来测试一门课(我同意你的基利安)。现在,某些类必须连接到数据库。如果我想测试该类并询问“我该怎么做”,许多人会说:“使用依赖注入!” 但这只会将问题转移到另一类,不是吗?所以我问,如何测试真正建立连接的类? 奖励问题:这里的一些答案归结为“使用模拟对象!” 这意味着什么?我模拟了被测类所依赖的类。我现在应该模拟被测类并实际测试该模拟(这与使用模板方法的想法很接近,见下文)?

11
输出不确定的单元测试方法
我有一个用于生成随机密码的类,该密码的长度也是随机的,但仅限于定义的最小和最大长度之间。 我正在构建单元测试,并且在此类中遇到了一个有趣的小问题。单元测试背后的整个想法是,它应该是可重复的。如果您运行测试一百次,它应该给出一百次相同的结果。如果您依赖某些可能会或可能不存在的资源,或者可能会或可能不会处于初始状态,那么您就应该模拟有问题的资源,以确保您的测试确实总是可重复的。 但是,如果应该SUT产生不确定的输出呢? 如果我将最小和最大长度固定为相同的值,那么我可以轻松地检查所生成的密码是否具有预期的长度。但是,如果我指定了可接受的长度范围(例如15至20个字符),那么您现在遇到的问题是,您可以运行一百次测试并获得100次通过,但是在第101次运行时,您可能会得到9个字符串。 就密码类而言,它的核心是相当简单的,它不应证明是一个大问题。但这让我想到了一般情况。在处理通过设计产生不确定输出的SUT时,通常被认为是最好的策略是什么?

7
是否需要保留对简单(自包含)功能的测试?
考虑一下: public function polynominal($a, $b, $c, $d) { return $a * pow($x, 3) + $b * pow($x, 2) + $c * $x + $d; } 假设您为上述功能编写了各种测试,并向自己和其他人证明“它可以工作”。 为什么不删除这些测试,然后过上幸福的生活呢?我的观点是,某些功能在被证明可以正常工作后,无需对其进行连续测试。我正在寻找状态的对立点,是的,这些功能仍然需要测试,因为:...或者是的,这些功能不需要进行测试...

6
您应该如何TDD Yahtzee游戏?
假设您正在编写Yahtzee游戏TDD风格。您要测试代码部分,确定一组五个压模辊是否满座。据我所知,在进行TDD时,您遵循以下原则: 首先编写测试 写出最简单可行的方法 优化和重构 因此,初始测试可能如下所示: public void Returns_true_when_roll_is_full_house() { FullHouseTester sut = new FullHouseTester(); var actual = sut.IsFullHouse(1, 1, 1, 2, 2); Assert.IsTrue(actual); } 当遵循“写出可能的最简单的IsFullHouse方法”时,您现在应该这样编写方法: public bool IsFullHouse(int roll1, int roll2, int roll3, int roll4, int roll5) { if (roll1 == 1 && roll2 == 1 && roll3 == 1 …
36 unit-testing  tdd 

12
测试驱动开发(TDD)是否实际上使一个现实项目受益?
我对编码并不陌生。我已经(认真)编码了15年以上。我一直对我的代码进行一些测试。但是,在过去的几个月中,我一直在使用Ruby on Rails学习测试驱动的设计/开发(TDD)。到目前为止,我还没有看到好处。 我看到为某些事情编写测试有一些好处,但很少。尽管我喜欢首先编写测试的想法,但与调试实际代码相比,我发现我花费大量时间尝试调试我的测试,以使他们说出我的意思。这可能是因为测试代码通常比其测试的代码复杂得多。我希望这只是可用工具(在这种情况下为RSpec)的经验。 但是,我必须说,在这一点上,令人沮丧的程度加上令人失望的性能不足令人无法接受。到目前为止,我从TDD看到的唯一价值是不断增长的RSpec文件库,该库可用作其他项目/文件的模板。与实际的项目代码文件相比,这没有什么用处,也许没有用。 在阅读现有文献时,我注意到TDD似乎需要大量时间,但最终会获得回报。我只是想知道,有没有现实世界的例子?这种巨大的挫败感是否能在现实世界中得到回报? 我真的希望我不要在这里的其他地方错过这个问题。我进行了搜索,但是所有问题/答案都已经过了几年了。这是我难得的一次机会,当时我发现一个开发人员会对TDD不好说,这就是为什么我花了很多时间在此上的原因。但是,我注意到似乎没有人指出具体的实际示例。我确实读过一个答案,说在2011年调试代码的人会感谢您拥有完整的单元测试套件(我认为评论是在2008年提出的)。 所以,我只是想知道,在所有这些年之后,我们是否最终有任何例子表明收益是真实的?是否有人真的继承或返回了使用TDD设计/开发的代码,并具有完整的单元测试集,并且确实感到收获了?还是您发现您花了太多时间试图弄清楚测试正在测试什么(以及为什么它很重要),以至于您只是把整个混乱扔进了代码中?

11
编写最少的代码以通过单元测试-不作弊!
在进行TDD并编写单元测试时,如何在编写要测试的“实现”代码的第一次迭代时抵制“作弊”的冲动? 例如: 让我们需要计算一个数字的阶乘。我从一个单元测试开始(使用MSTest),例如: [TestClass] public class CalculateFactorialTests { [TestMethod] public void CalculateFactorial_5_input_returns_120() { // Arrange var myMath = new MyMath(); // Act long output = myMath.CalculateFactorial(5); // Assert Assert.AreEqual(120, output); } } 我运行此代码,但由于该CalculateFactorial方法甚至不存在而失败。因此,我现在编写代码的第一次迭代以实现被测方法,并编写通过测试所需的最少 代码。 问题是,我一直很想写以下内容: public class MyMath { public long CalculateFactorial(long input) { return 120; } } 从技术上讲,这是正确的,因为它确实是“作弊”,因为它实际上甚至没有尝试执行计算阶乘的功能,尽管它确实是进行特定测试通过(变为绿色)所需的最少代码。当然,现在重构部分成为“编写正确的功能”的练习,而不是真正的实现重构。显然,添加具有不同参数的其他测试将失败并强制进行重构,但是您必须从该测试开始。 因此,我的问题是,如何在“编写最少的代码以通过测试”同时又保持其功能与您实际试图实现的精神之间取得平衡?
36 unit-testing  tdd 

3
集成测试是否要重复所有单元测试?
假设我有一个函数(用Ruby编写,但每个人都应该理解): def am_I_old_enough?(name = 'filip') person = Person::API.new(name) if person.male? return person.age > 21 else return person.age > 18 end end 在单元测试中,我将创建四个测试以涵盖所有场景。每个Person::API对象都将使用带有stubbed方法male?和的模拟对象age。 现在谈到编写集成测试。我认为不应再嘲笑Person :: API。因此,我将创建完全相同的四个测试用例,但不模拟Person :: API对象。那是对的吗? 如果是,那么编写单元测试的意义何在?如果我可以编写使我更有信心的集成测试(因为我在处理真实对象,而不是存根或模拟对象)?

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.