Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/unit-testing/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Unit testing “写作”;“可测试单元”;密码?_Unit Testing_Language Agnostic_Automated Tests - Fatal编程技术网

Unit testing “写作”;“可测试单元”;密码?

Unit testing “写作”;“可测试单元”;密码?,unit-testing,language-agnostic,automated-tests,Unit Testing,Language Agnostic,Automated Tests,您使用什么样的实践使代码更易于单元测试?首先编写测试-这样,测试驱动您的设计。我尽可能使用测试驱动开发,因此我没有任何无法进行单元测试的代码。除非首先存在单元测试,否则它不会存在。依赖项注入似乎有帮助。最简单的方法是,除非使用它签入测试,否则不要签入代码 我不太喜欢先写测试。但有一件事我非常坚信,代码必须通过测试签入。甚至不到一个小时前,一起。我认为,只要它们放在一起,它们的书写顺序就不那么重要了 使用TDD 在编写代码时,尽可能使用依赖注入 编程到接口,而不是具体的类,所以您可以替换模拟实现

您使用什么样的实践使代码更易于单元测试?

首先编写测试-这样,测试驱动您的设计。

我尽可能使用测试驱动开发,因此我没有任何无法进行单元测试的代码。除非首先存在单元测试,否则它不会存在。

依赖项注入似乎有帮助。

最简单的方法是,除非使用它签入测试,否则不要签入代码

我不太喜欢先写测试。但有一件事我非常坚信,代码必须通过测试签入。甚至不到一个小时前,一起。我认为,只要它们放在一起,它们的书写顺序就不那么重要了

  • 使用TDD
  • 在编写代码时,尽可能使用依赖注入
  • 编程到接口,而不是具体的类,所以您可以替换模拟实现

  • 确保你的所有课程都遵循以下步骤。单一责任意味着每个类都应该有并且只有一个责任。这使得单元测试更加容易。

    小型、高度内聚的方法。我用艰苦的方式学习。假设您有一个处理身份验证的公共方法。也许你做了TDD,但是如果这个方法很大,那么调试就会很困难。相反,如果authenticate方法以一种更为伪密码的方式进行工作,调用其他小方法(可能受保护),当出现错误时,就很容易为这些小方法编写新的测试并找到错误的方法。

    • TDD——首先编写测试,强制 您需要考虑可测试性和 帮助编写实际可用的代码 需要的,不是你认为你可能需要的 需要

    • 对接口进行重构——使 嘲笑更容易

    • 如果不使用虚拟方法,则使用公共方法 接口——使模拟更容易

    • 依赖项注入——制造嘲弄 容易的

    • 更小、更有针对性的方法-- 测试更集中,更容易理解 写

    • 避免静态类


    • 避免单身,除非 必要的

    • 避免使用密封类


    还有一些东西是在OOP中你首先学到的,但是很多人似乎忘记了:针对接口的代码,而不是实现。

    花一些时间重构不稳定的代码以使其可测试。编写测试并获得95%的覆盖率。这样做让我学到了编写可测试代码的所有知识。我并不反对TDD,但了解使代码可测试或不稳定的具体因素有助于您在设计时考虑可测试性。

    要使代码可测试,请执行以下操作:

    • 记录您的假设和排除情况
    • 避免使用做不止一件事的大型复杂类——记住以下几点
    • 如果可能,使用接口来解耦交互,并允许注入模拟对象
    • 如果可能,将pubic方法设置为虚拟,以允许模拟对象模拟它们
    • 如果可能,在设计中使用组合而不是继承-这也鼓励(并支持)将行为封装到接口中
    • 如果可能,使用库(或DI实践)为实例提供外部依赖关系

    <强>从您的单元测试中获得最大值,请考虑以下内容:< /强>

    • 让您自己和您的开发团队了解单元测试框架、模拟库和您打算使用的测试工具的功能。当您真正开始编写测试时,了解他们能做什么和不能做什么是至关重要的
    • 在开始编写测试之前,先计划好测试。确定要包含在测试中的边缘情况、约束、先决条件、后条件和排除
    • 尽可能在您发现损坏的测试时修复它们。测试可以帮助您发现代码中的缺陷和潜在问题。如果你的测试失败了,你将不得不在以后修复更多的东西
    • 如果您在团队中遵循代码审查流程,那么也要对单元测试进行代码审查。单元测试和任何其他代码一样,都是系统的一部分——审查有助于识别测试中的弱点,就像审查系统代码一样

    在编写测试时(与任何其他软件任务一样),不要重复自己的操作(干燥原则)。如果您有对多个测试有用的测试数据,那么将其放在两个测试都可以使用的地方。不要将代码复制到两个测试中。我知道这似乎很明显,但我一直看到这种情况发生。

    我肯定我会为此投反对票,但我还是要发表意见:)

    虽然这里的许多建议都很好,但我认为需要稍加调整。目标是编写更健壮、可更改和可维护的软件

    我们的目标不是让代码可以进行单元测试。尽管可测试代码并不是目标,但要使代码更“可测试”还需要付出很多努力。这听起来真的很好,我相信这会给人们带来温暖的模糊感,但事实是所有这些技术、框架、测试等等都是有代价的


    它们会在培训、维护、生产开销等方面花费时间。有时值得,有时不值得,但你永远不应该蒙在鼓里,让你的代码更“可测试”。

    没有静态-你不能模拟静态


    谷歌也有一个工具,可以测量你的代码的可测试性…

    我一直在努力寻找一个过程,在这个过程中,单元测试不是一件烦琐的事情,而是我真正想做的事情。根据我的经验,一个相当大的因素是你的工具。我做了很多ActionScript工作,遗憾的是,这些工具有点有限,比如没有IDE集成,也没有更高级的模拟框架(但好事即将发生,所以这里没有抱怨!)。
    1.Using a framework/pattern like MVC to separate your UI from you
    business logic will help a lot. 
    2. Use dependency injection so you can create mock test objects.
    3. Use interfaces.