如何编写好的unit testing?
任何人都可以build议学习unit testing的书籍或材料吗?
有些人认为没有unit testing的代码是遗留代码。 如今,testing驱动开发是轻松pipe理大型软件项目的方法。 我非常喜欢C ++,我没有经过任何正式的教育就自己学习了。 我从来没有考虑过unit testing,所以觉得被遗漏了。 我认为unit testing是重要的,从长远来看将是有帮助的。 我将不胜感激这个话题的任何帮助。
我关心的主要问题是:
-
什么是unit testing? 这是一个应该分析的testing用例的综合列表吗? 所以,让我们说,我有一个名为“复杂数字”的类中有一些方法(让我们find共轭,一个重载赋值运算符和一个重载乘法运算符,这样的类应该是典型的testing用例吗?selecttesting用例?
-
是否有任何框架可以为我创buildunit testing,或者我必须编写自己的类来进行testing? 我在Visual Studio 2008中看到了一个“testing”选项,但从来没有工作。
-
unit testing的标准是什么? 是否应该为class级中的每个function进行unit testing? 每个class级都有unit testing是否有意义?
一个重要的观点(我一开始就没有意识到)是unit testing是一种testing技术,可以独立使用,而不需要应用完整的testing驱动方法。
例如,您可以通过向问题区域添加unit testing来改进遗留应用程序,或者希望在现有应用程序中查找错误。 现在你写一个unit testing来暴露问题代码,然后修复它。 这些是半testing驱动的,但是可以完全适合您当前的(非TDD)开发过程。
我发现有用的两本书是:
在Microsoft .NET中testing驱动的开发
从Kent Becks原版的TDD书中,我们可以看到Test Driven的发展。
用C#和nUnit进行语用unit testing
它直接指出unit testing是什么,以及如何应用它。
回应你的观点:
-
unit testing实际上是类中的一个方法,它只包含足够的代码来testing应用程序的一个方面/行为。 因此,您通常会进行许多非常简单的unit testing,每个testing都会testing一小部分应用程序代码。 例如,在nUnit中,您将创build一个TestFixture类,其中包含任意数量的testing方法。 关键是testing“testing你的代码的一个单位”,即尽可能最小(明智的)单位。 你不testing你使用的底层API,只是你写的代码。
-
有一些框架可以用来创buildtesting类,但是我不推荐它们。 为了创build实际上为重构提供安全网的有用的unit testing,除了开发人员思考如何testing代码以外,别无select。 如果你开始依赖于生成unit testing,那么把它们看成是另一个必须完成的任务就太容易了。 如果你发现自己在这种情况下,你完全错了。
-
对于每个类,每种方法有多lessunit testing,没有简单的规则。您需要查看您的应用程序代码,并对复杂性存在的位置进行教育性评估,并为这些区域编写更多的testing。 大多数人开始通过testing公共方法,因为这些通常会运用其余的私有方法。 然而,情况并非总是如此,有时需要testing私有方法。
简而言之,即使有经验的unit testing人员也会从编写明显的unit testing开始,然后寻找更细微的testing,一旦他们编写了明显的testing,testing就会变得更加清晰。 他们不希望事先做好每一个testing,而是在他们想到的时候添加它们。
虽然你已经接受了你的问题的答案,我想推荐一些尚未提及的其他书籍:
- 使用遗留代码有效地工作 – Michael Feathers – 据我所知,这是唯一一本充分解决将现有的代码devise成可testing代码的专题的书。 作为更多的参考手册,它分为三个部分:工具和技术概述,一系列传统代码中常见路障的专题指南,本书其余部分引用的一组特定的依赖关系打破技术。
- 敏捷的原则,模式和实践 – 罗伯特·C·马丁 – 在Java中的例子,有一个在C#中的例子续集。 两者都很容易适应C ++
- 清洁代码:敏捷软件工匠手册 – Robert C. Martin – Martin将其描述为APPP书籍的前传,我同意。 本书以专业性和自律性为例,是任何认真的软件开发人员的两个基本素质。
Robert(Uncle Bob)Martin的两本书比unit testing涵盖的材料要多得多,但是它们驱使着unit testing对代码质量和生产力的有益之处。 我发现自己经常提到这三本书。
在.NET中,我强烈推荐Roy Osherove的“unit testing的艺术”,它非常全面和充分的build议。
unit testing只是一种行使特定代码的方法,以确保一组定义的条件导致预期的设置。 正如史蒂文指出的那样,这些“练习”应该检查一系列标准(“BICEP”)。 是的,理想情况下,您应该testing所有class级和所有这些class级的方法,虽然总是有一定的判断余地:testing本身不应该是目的,而应该支持更广泛的项目目标。
好吧,理论是好的,但要真正理解unit testing,我的build议是把适当的工具放在一起,然后开始。 像编程中的大多数事情一样,如果你有正确的工具,那么很容易通过做。
首先,拿起一个NUnit的副本。 它是免费的,易于安装和易于使用。 如果您需要一些文档,请查看C#中使用NUnit的实用unit testing。
接下来,到http://www.testdriven.net/并获得TestDriven.net的副本。; 它安装到Visual Studio 2008中,并允许您右键单击访问全面的testing工具,包括对文件,目录或项目运行NUnittesting的能力(通常,testing是在单独的项目中编写的)。 你也可以用debugging运行testing,或者最酷的是,运行所有的testing,对NCover的副本。 NCover会告诉你究竟是在执行什么样的代码,这样你就可以找出你需要提高testing覆盖率的地方。 TestDriven.net的专业授权费用为170美元,但如果你和我一样,它将很快成为你的工具箱中不可或缺的工具。 无论如何,我发现它是一个很好的专业投资。
祝你好运!
如今,testing驱动开发是轻松pipe理大型软件项目的方法。
这是因为TDD允许您在每次更改之后确保在更改前工作的所有内容仍然有效,如果不一致,则可以让您更轻松地查明所发生的故障。 (见最后)
什么是unit testing? 这是一个应该分析的testing用例的综合列表吗?
unit testing是一段代码,要求代码的一个“单元”执行一个操作,然后validation操作确实执行了,结果如预期。 如果结果不正确,则会引发/logging错误。
所以,让我们说,我有一个名为“复杂数字”的类中有一些方法(让我们find共轭,一个重载赋值运算符和一个重载乘法运算符,这样的类应该是典型的testing用例吗?selecttesting用例?
理想情况下,你会testing所有的代码。
-
当您创build类的实例时,将使用正确的默认值创build它
-
当你要求它find共轭时,它find了正确的(也是testing边界情况,如共轭为零)
-
当您分配一个值时,该值被分配并正确显示
-
当你用一个值乘以一个复数时,它被正确地相乘
是他们的任何框架,可以为我创buildunit testing,或者我必须写我自己的类testing?
见CppUnit
我在Visual Studio 2008中看到了一个“testing”的选项,但从来没有得到它的工作。
不确定。 我没有使用VS 2008,但它可能只适用于.NET。
unit testing的标准是什么? 是否应该为class级中的每个function进行unit testing? 每个class级都有unit testing是否有意义?
是的,它确实。 虽然这是一个可怕的很多代码来编写(并保持每一个变化)价格是值得支付大型项目:它保证你的代码基地的变化做你想要他们,没有别的 。
另外,当你做出改变时,你需要更新unit testing的更改(以便再次通过)。
在TDD中,你首先决定你想要代码做什么(比如复杂的数字类),然后编写validation这些操作的testing,然后编写这个类,以便testing编译和正确执行(没有其他)。
这可以确保你编写尽可能less的代码(并且不要使复杂类的devise过于复杂),而且还确保代码执行它的function。 在编写代码的最后,你有一种方法来testing它的function,并确保它的正确性。
您还有一个使用您可以随时访问的代码的例子。
要进一步阅读/文档,请查看unit testing和TDD中使用的“dependency injection”和方法存根。
我无法回答你对Visual Studio 2008的问题,但我知道Netbeans有几个集成的工具供你使用。
- 代码覆盖率2允许您查看哪些path已被检查,unit testing实际覆盖了多less代码。
- 它支持内置的unit testing。
至于testing的质量,我借用Andrew Hunt和David Thomas的“ 用JUnit进行Java的实用unit testing ”
unit testing应该检查BICEP :Briep, I nverse关系, C ross-checking, E rror条件和性能。
testing的质量也是由A-TRIP决定的: 一个自由的, 一个可怕的,独立的和专业的。
-
通过testing驱动devise,您通常首先需要编写testing。 他们应该涵盖您实际使用/将要使用的操作。 也就是说,除非客户端代码需要完成工作,否则不应该存在。 selecttesting案例是一门艺术。 有一些显而易见的事情,例如testing边界条件,但是最终没有人发现确保testing(单位或其他)覆盖所有重要条件的真正可靠的,系统的方法。
-
是的,有框架。 最着名的几个是:
提升unit testing框架
CppUnit的CPPUnit是JUnit的一个端口,所以以前使用JUnit的人可能会觉得很舒服。 否则,我倾向于推荐Boost – 他们也有一个testing库来帮助编写单独的testing – 而不是一个方便的补充。
-
unit testing应该足以确保代码正常工作。 如果(例如)你有一个内部使用的私有函数,你通常不需要直接testing它。 相反,你testing任何提供公共接口。 只要这个工作正确,外部世界的工作就不是它的工作。 当然,在某些情况下,对小块进行testing会比较容易 ,而且在这种情况下,这是完全合法的 – 但是最终您会关心可见接口,而不是内部。 当然,整个外部接口应该被执行,而通常select的testing用例通过代码来行使path。 同样,unit testing与其他types没有什么大不同。 这主要是一个更系统的方法来应用正常的testing技术。
下面是关于什么时候不写unit testing(即什么时候可行,甚至最好是跳过unit testing)的问题: 应该testing内部实现还是只testing公共行为?
简短的回答是:
- 当你可以自动化集成testing时(因为有自动化testing很重要,但是这些testing不必是unit testing)
- 当运行集成testing套件很便宜(如果需要两天运行,或者如果您不能让每个开发人员都能访问集成testing设备)
- 在集成testing之前没有必要find缺陷(部分取决于组件是单独开发还是逐步开发)
购买“xUnittesting模式:重构testing代码”一书。 它非常优秀。 它涵盖了高层战略决策以及低层testing模式。
如今,testing驱动开发是轻松pipe理大型软件项目的方法。
TDDbuild立在unit testing之上,但它们是不同的。 你不需要使用TDD来使用unit testing。 我个人的偏好是先写testing,但我不觉得我做了整个TDD的事情。
什么是unit testing?
unit testing是一个testing一个单元行为的代码。 人们如何定义一个单位。 但总的来说他们是:
- 快速运行
- 彼此独立
- 只testing你的代码库的一小部分(一个单元;)。
- 二元结果 – 这是通过或失败。
- 应该只testing一个单位的结果(对于每个结果创build一个不同的unit testing)
- 重复
他们的任何框架都可以创buildunit testing
写testing – 是的,但我从来没有见过任何人说他们很好。
为了帮助你编写和运行testing, 一大堆 。
是否应该为class级中的每个function进行unit testing?
你有几个不同的阵营 – 100%的人会说是的。 每种方法都必须经过testing,你应该有100%的代码覆盖率 。 另一个极端是unit testing应该只涵盖你甚至遇到错误的地方,或者你期望find错误。 中间地带(以及我所采取的立场)是unit testing一切不是“太简单”的事情。 Setter / getters以及任何只是调用其他方法的东西。 我的目标是拥有80%的代码覆盖率和较低的CRAP因子(因此我调皮的机会很less,决定不testing一些“太复杂”的testing)。
帮助我“得到”unit testingJUnit in Action的书 。 对不起,我没有在C ++世界做太多的事情,所以我不能build议一个基于C ++的select。