什么的单元测试 单元测试工具
测试是软件开发的重要环节之一。按照软件开发的过程测试可分为:单元测试、集成测试、系统测试、域测试(Field test)等。
单元测试(unit testing)在软件开发领域有着悠久的历史。在大多数有关单元测试的观念中都有这么一个共同的理念,即它们由一组独立的测试构成,其中每个测试针对一个单独的软件组件。在过程式程序设计的代码中,“单元”一般来说指的就是函数,而在面向对象的代码中则指的是类。
那么,我们究竟能否做到只测试系统中的某一个函数或类呢?在过程式系统中,通常是难以孤立地测试函数的,因为这种系统中的情况往往是顶层的函数调用其他函数,后者再调用另一些函数,最后直到机器层。而在面向对象的系统中,单独测试类则要简单一点,然而实际上类却往往并不是“离群索居”的生物。想想看,在你写过的所有类中有多少是没有使用到别的类的?非常少这些极个别分子往往是那些小型的数据类或数据结构类,如栈和队列(甚至就算是这样的类也可能会用到其他类)。
测试的隔离性是单元测试的一个重要方面,然而为什么说它是重要的呢?毕竟,当整合软件的各个部分时还可能出现许多错误。难道不应该是那些能够覆盖代码中的广泛功能区域的大型测试更为重要吗?诚然,它们是重要的,我并不否认这一点,然而大型测试存在着一些问题:
q 错误定位:测试离被测试者越远,就越难确定测试失败究竟意味着什么。要想精确定位测试失败的根源往往需要耗费大量的工作。你得检查测试输入、还要检查失败本身,然后还得确定这次失败发生在从输入到输出的执行路径上的哪一点。虽说对于单元测试来说这样的工作也是免不了的,然而通常其工作量微乎其微。
q 执行时间:大型测试往往需要更长时间来运行。而这种长时耗性往往让人无法忍受。需要太长时间运行的测试,结果往往是无法运行。
q 覆盖:在大型测试中,往往难以看出某段代码与用来测试它的值之间的联系。我们通常可以通过覆盖工具来查出某段代码是否被一个测试覆盖到了,但当添加新的代码时,可能就需要花费可观的工作量来创建检验这段新代码的高层测试了。
而单元测试则做到了大型测试所不能做到的那些事情。利用单元测试可以独立地对某一段代码进行测试。我们可以将测试分组以便在某些特定条件下运行某些特定的测试,并在其他条件下运行另一些测试。我们还可以迅速定位错误。如果认为在某段代码中存在着一个错误而且又可以在测试用具中使用这段代码的话,我们通常能够迅速地编写出一段测试,看看我们所推测的错误是不是真的在那里。
测试的覆盖种类
1.语句覆盖:语句覆盖就是设计若干个测试用例,运行被测试程序,使得每一条可执行语句至少执行一次。
2.判定覆盖(也叫分支覆盖):设计若干个测试用例,运行所测程序,使程序中每个判断的取真分支和取假分支至少执行一次。
3.条件覆盖:设计足够的测试用例,运行所测程序,使程序中每个判断的每个条件的每个可能取值至少执行一次。
4.判定——条件覆盖:设计足够的测试用例,运行所测程序,使程序中每个判断的每个条件的每个可能取值至少执行一次,并且每个可能的判断结果也至少执行一次。
5.条件组合测试:设计足够的测试用例,运行所测程序,使程序中每个判断的所有条件取值组合至少执行一次。
6.路径测试:设计足够的测试用例,运行所测程序,要覆盖程序中所有可能的路径。
用例的设计方案主要的有下面几种:条件测试,基本路径测试,循环测试。通过上面的方法可以实现测试用例对程序的逻辑覆盖,和路径覆盖。
下面是好的单元测试所应具备的品质:
(1) 运行快;
(2) 能帮助我们定位问题所在。
在业界,人们在判断某个特定的测试是否是单元测试这个问题上常常摇摆不定。如果一个测试中涉及了另外一个产品类,那它还能算是单元测试吗?为了回答这个问题,我们回到刚才提到的两点品质上来,即该测试运行起来快不快?它能帮我们快速定位错误吗?比如有些测试较大,其中用到了好多类。那么实际上这种测试或许看上去像是小型的集成测试。就它们自身而言,可能运行起来比较快,然而要是你将它们一起运行呢?一个测试如果不仅测试了某个类还测试了与该类一起工作的几个类,那么它往往会“越长越大”。如果你当时不花时间来使得一个类能够在测试用具中单独实例化的话,难道你还能指望当更多的代码被添加进系统之后这件事会变得更容易吗?永远也不会。人们会不断推诿,并且随着时间的推移,原本短小的测试可能会变得需要十分之一秒才能执行完。
文章来源于领测软件测试网 https://www.ltesting.net/