1、上路
1.1 什么是单元测试?
单元测试是开发者编写的一小段代码,用于检验被测代码的一个很小的、很明确的功能是否正确。通常情况下,一个单元测试(用例)用于判断某个特定条件(或场景)下特定函数的行为。
例如,我们要编写一个类,它要实现有序的List功能,当向其添加一个元素时,程序应该能够按照它的大小将其插到合适的位置。这是我们编写一个测试用例,将一个很大的值放入这个List中,然后确认该值出现在List的尾部。
简单地说,执行单元测试是为了验证某段代码的行为是否与开发者所期望的一致。
单元测试是必要的吗?
单元测试是由开发者编写和执行的,针对的也只是那些很小规模的代码,那么对于客户或最终用户来说,它们影响大吗?它们是必要的吗?
其实,我们在进行单元测试时,我们所关心的规模很小的、独立的代码片段。我们的哲学是首先对所有单独部分的行为建立起信心(确信它们与期望一致),然后再安心的组装和测试整个系统。毕竟,如果盖房所用的砖瓦都没法保证质量,我们对房子还能期望什么呢?如果不先对砖瓦进行检查、验证,那么盲目的进行建筑岂不是极大的浪费?
另一方面,单元测试只是各种测试中的第一步,在此之后,我们还需要其它形式的测试,比如集成测试、系统测试等,这个就视需要而定了。
1.2 为什么要使用单元测试?
“单元测试让生活更轻松。”
这听起来像是某句广告词,它究竟效果如何呢?
让我们回到现实,假定我们正在开发一个网站程序。首先我们会将整个程序设计为三层:数据访问层、业务逻辑层和表现层。首先是编写数据访问层,如何测试它是否正确呢?如果没有进行单元测试,那么就得等到业务逻辑层和表现层开发完毕后才能打开页面进行测试。而这中间,业务逻辑层要调用数据访问层,表现层要调用业务逻辑层的代码。如果通过页面发现某个功能没有通过,我们就得进行调试,调试时要一步一步地跟踪代码,好不容易找到bug所在了,原来是数据访问的一个方法里出了问题,把该方法改好了,编译不通过!看来还得修改另外两层的代码,好,把代码都改好了,再次打开页面进行测试,糟糕还是没通过。上面的过程再来一次。。。
上面这种方式的缺点可以总结为:
错误难以定位:每次要打开页面、输入值、调试,单元测试可能也需要这些过程,但其工作量则会小很多。
执行时间长:较之单元测试,上面的方式显然耗时得多。
代码覆盖:可以理解的是,涉及的代码层次越多,就越是难以确定被测代码和测试值之间的关系。我们要覆盖到所有的数据访问层的代码,就要花费很大的精力。
在应用了(好的)单元测试后,一切都将变得不同了。我们可以快速定位错误,执行的时间也要短得多,代码覆盖也更容易进行。
如果一开始就对数据访问层和业务逻辑层进行了良好的单元测试,那么接下来表现层的开发就顺利得多了,我们相信前面的代码已经相当不错了,可以开心地编写后面的代码。一旦出了问题,我们也很容易定位和修改。
所以说,单元测试让开发人员对自己的代码充满信心,这项看似简单的技术可以让代码变得更加完美,从而让我们的生活更轻松。
1.3 它能给我带来什么?
引入单元测试是简单的,它本身是充满乐趣的,但我们不会将它交给客户和最终用户。我们得考虑一下,单元测试的目的是什么。首先的一点是,使用单元测试是为了让我们的工作更为轻松。
当然了,可执行的文档具有自我验证正确与否的优点,在首次编写后就不需很大的工作量了。不像普通意义上的文档,它不会出现与代码不一致的情况(除非你不再执行测试或者让它们一直失败下去)。
文章来源于领测软件测试网 https://www.ltesting.net/