Questions tagged «unit-testing»

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

6
如何对编码器进行单元测试?
我有这样的事情: public byte[] EncodeMyObject(MyObject obj) 我一直在这样的单元测试: byte[] expectedResults = new byte[3]{ 0x01, 0x02, 0xFF }; Assert.IsEqual(expectedResults, EncodeMyObject(myObject)); 编辑:我见过的两种建议是: 1)使用硬编码的期望值,如上面的示例。 2)使用解码器解码编码的字节数组并比较输入/输出对象。 我在方法1中看到的问题是它非常脆弱,并且需要很多硬编码值。 方法2的问题在于测试编码器取决于解码器是否正常工作。如果编码器/解码器在同一位置均被损坏,则测试可能会产生误报。 这些可能是测试此类方法的唯一方法。如果是这样,那很好。我在问这个问题,看看是否有针对这种测试的更好的策略。我无法透露我正在使用的特定编码器的内部。我通常问的是您将如何解决这类问题,我不认为内部问题很重要。假定给定的输入对象将始终产生相同的输出字节数组。

5
与称为功能测试的功能测试相比,正确的功能测试有什么明显的优势?
我正在研究的项目中有很多遗留测试,没有正确模拟出来。因此,它具有的唯一依赖性是EasyMock,它不支持静态变量,带有参数的构造函数等。测试而是依靠数据库连接,从而“运行”测试。由于需要升级现有项目以支持它,因此添加powermock来处理这些情况由于成本过高而被拒绝(另一讨论)。 我的问题是,我可以用来推销正确的单元测试的真实世界有哪些实际好处?有吗 我是在说不好的单元测试(即使它们可以工作)是不好的吗?代码覆盖范围是否同样有效?

2
单元测试:“如果您进行重构并且没有合作者,这是代码的味道”?
我正在阅读Roy Osherove撰写的《单元测试的艺术》。我在第7.2节“编写可维护的测试”中,作者对代码气味有此说明: 注意:当您重构内部状态以使其对外部测试可见时,是否可以将其视为代码异味(表示代码设计或逻辑中可能存在问题的迹象)?当您重构以暴露协作者时,这不是代码的味道。如果您要重构并且没有协作者,这是一种代码味道(因此您不需要存根或模拟任何东西)。 编辑:作者所说的“合作者”是依赖。他关于依赖项的一些示例是访问数据库或访问OS的文件系统的类。他在这里定义存根并开始使用“协作者”一词: 甲存根是用于现有的可控替换依赖性(或 合作者在系统中)。 作者没有此代码气味的示例,并且我在理解/描绘其外观时遇到困难。有人可以再解释一下,也许可以提供一个具体的例子?

4
为启动外部EXE的类编写单元测试
我编写了一个C#类,用于启动EXE列表(不是我的一个-我必须运行的第三方EXE)并使其保持运行状态(偶尔检查以确保它仍在运行,如果没有,则启动它们) 。 我能够测试添加,删除等的基本逻辑。如何对保持EXE的实际工作进行单元测试? 我最初的想法是启动一些虚拟EXE,该EXE在1秒后关闭,然后使用它进行测试。这是否超出了单元测试的范围?

9
作为专业开发人员,不编写单元测试是否可以接受?[关闭]
按照目前的情况,这个问题不适合我们的问答形式。我们希望答案会得到事实,参考或专业知识的支持,但是这个问题可能会引起辩论,争论,民意调查或扩展讨论。如果您认为此问题可以解决并且可以重新提出,请访问帮助中心以获取指导。 7年前关闭。 只是想知道TDD /自动单元测试的优缺点,并寻找社区对于专业开发人员在不支持单元测试的情况下编写应用程序是否可接受的观点?

3
如何简化我复杂的有状态类及其测试?
我在用Java编写的分布式系统项目中,其中有一些类对应于非常复杂的现实世界业务对象。这些对象具有许多与用户(或某些其他代理)可以应用于该对象的操作相对应的方法。结果,这些类变得非常复杂。 系统通用体系结构方法导致许多行为集中在少数几个类上,并且涉及许多可能的交互方案。 举个例子,为了使事情变得简单明了,假设机器人和汽车是我项目中的类。 因此,在Robot类中,我将采用以下模式提供许多方法: 睡觉(); isSleepAvaliable(); 苏醒(); isAwakeAvaliable(); 步行(方向);isWalkAvaliable(); 射击(方向);isShootAvaliable(); turnOnAlert(); isTurnOnAlertAvailable(); turnOffAlert(); isTurnOffAlertAvailable(); recharge(); isRechargeAvailable(); powerOff(); isPowerOffAvailable(); stepInCar(Car); isStepInCarAvailable(); stepOutCar(Car); isStepOutCarAvailable(); 自毁(); isSelfDestructAvailable(); 死(); isDieAvailable(); 活着(); isAwake(); isAlertOn(); getBatteryLevel(); getCurrentRidingCar(); getAmmo(); ... 在Car类中,它将类似于: 打开(); isTurnOnAvaliable(); 关掉(); isTurnOffAvaliable(); 步行(方向);isWalkAvaliable(); 加油(); isRefuelAvailable(); 自毁(); isSelfDestructAvailable(); crash(); isCrashAvailable(); isOperational(); isOn(); getFuelLevel(); getCurrentPassenger(); ... …

3
如何构造表现出相同行为的多个对象的单元测试?
在很多情况下,我可能有一个具有某些行为的现有类: class Lion { public void Eat(Herbivore herbivore) { ... } } 我有一个单元测试 [TestMethod] public void Lion_can_eat_herbivore() { var herbivore = buildHerbivoreForEating(); var test = BuildLionForTest(); test.Eat(herbivore); Assert.IsEaten(herbivore); } 现在,发生的事情是我需要创建一个与Lion具有类似行为的Tiger类: class Tiger { public void Eat(Herbivore herbivore) { ... } } ...由于我想要相同的行为,因此我需要运行相同的测试,因此我需要执行以下操作: interface IHerbivoreEater { void Eat(Herbivore herbivore); } ...然后重构测试: …

3
敏捷开发部署过程。质量检查和业主在哪里进行测试?
最近,我一直在大量阅读使用SVN或GIT进行的各种Web应用程序部署过程,以期重新设计我们目前在我的工作地点进行部署的方式。 就像许多种敏捷方法一样,我们假设提交给主服务器或主干的任何东西都已准备就绪。GitHub和Etsy(http://codeascraft.etsy.com/2010/05/20/quantum-of-deployment/)都说他们是在此基础上工作的(尽管Etsy实际上有一个暂存环境)。 此过程假定所有单元测试和CI测试都已运行。您在本地和CI上运行测试,然后提交到中继。所以,在这一点上,您的代码在技术上是正确的。 您的代码在技术上可能是正确的,但是用户/功能测试可能会发现更多错误,尤其是在涉及前端测试时。 我的问题是这个。质量检查和企业所有者在哪里测试您实施的功能更改?在提交中继之前是在本地开发计算机上还是在QA /登台计算机上? 如果您有一台在主干上运行的登台计算机,并且假定提交到主干的所有代码都已准备好投入生产……嗯..那么,什么时候该代码已被批准,并且可以从技术和业务上投入生产透视?如果您只有一台登台计算机,并且有许多开发人员,并且要对这些代码进行质量检查,那么随着许多开发人员的更改可能正在等待注销,您如何从主干进行部署。 我很想听听其他人如何做到这一点?

4
单元测试中“单元”下的理解
据我理论上理解,“单位”下的人是指方法(在OOP中)。但是在实践中,孤立地验证某些方法的测试是非常脆弱的行为测试(不是验证结果,而是验证某些依赖方法的事实)。因此,我看到很多人从单位上了解一小组紧密相关的课程。在这种情况下,仅对外部依赖项进行了模拟/存根,对于内部单元内部实现中的依赖项,则使用该方法。在这种情况下,存在更多的状态,有意义的(根据规范)并且不是那么脆弱的测试。因此,问题是您对这些方法有何看法?将第二种方法称为单元测试是否有效?或者它是某种低级别的集成测试? 如果您发现通过这些测试方法之一应用TDD的一些特定注意事项,我将感谢您的想法。

5
我们通常应该花多长时间编写用于新功能或错误修复的单元测试?
当我必须实施新功能或修复错误时,我通常尝试通过测试来重新创建情况。我有时花大约3个小时来准备夹具并编写测试。实际的功能实现或错误修复不到1小时即可完成。 与实际实现功能或修复错误相比,其他人花费至少3倍的时间编写测试吗?编写测试与编写代码所花费的时间可接受的比率是多少?

4
单元测试的新名称[关闭]
已关闭。这个问题是基于观点的。它当前不接受答案。 想改善这个问题吗?更新问题,以便通过编辑此帖子以事实和引用的形式回答。 4年前关闭。 我从不喜欢单元测试。我一直认为这增加了我要做的工作量。 事实证明,仅就您编写的实际代码行数而言,这是正确的,此外,您可以在一小时内通过测试和测试驱动的开发编写的有用代码的行数增加完全抵消了这一点。 现在,我喜欢单元测试,因为它们允许我编写有用的代码,而这些代码通常在第一次使用时就可以使用!(敲木头) 我发现,如果人们在严格的时间表内或在其他人不这样做的环境中,他们不愿意进行单元测试或以测试驱动的开发开始项目。有点喜欢,一种文化拒绝甚至尝试。 我认为关于单元测试的最强大的功能之一就是它给您进行重构的信心。这也给我带来了新的希望,我可以将我的代码提供给其他人进行重构/改进,并且如果我的单元测试仍然有效,那么我可以使用他们修改过的新版本的库,几乎不用担心。 我认为这是单元测试的最后一个方面,需要一个新名称。单元测试更像是该代码现在和将来应该做什么的合同。 当我听到“测试”一词时,我想到了关在笼子里的老鼠,并对其进行了多次实验,以观察化合物的有效性。这不是单元测试,我们不是在尝试不同的代码来了解什么是最有影响力的方法,而是在定义我们期望的输出和输入。在老鼠的例子中,单元测试更像是宇宙如何工作的定义,而不是在老鼠身上进行的实验。 我是处于崩溃状态还是其他人看到拒绝进行测试,他们是否认为这是他们不想这样做的类似原因? 您/其他人给出不测试的原因是什么? 您认为他们的动机不是单元测试吗? 作为单元测试的新名称,它可以克服某些异议,jContract呢?(我知道一点Java中心:)还是单位合同?
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.