代码动态测试方法

2020-05-22  本文已影响0人  拂晓飞

单元测试是指,对软件中的最小可测试单元在与程序其他部分相隔离的情况下进行检查和验证的工作,这里的最小可测试单元通常是指函数或者类。

在具体的工程实践中,开发工程师为了设计并实现逻辑功能正确的代码,通常会有如下的考虑过程:

1. 如果要实现正确的功能逻辑,会有哪几种正常的输入;

2. 是否有需要特殊处理的多种边界输入;

3. 各种潜在非法输入的可能性以及如何处理。

讲到这里,你有没有回想起我跟你分享的 “ 等价类 ” 。没错,这些开发工程师眼中的代码 “ 功能点 ” ,就是单元测试的 “ 等价类 ” 。

完整的单元测试 “ 输入数据 ” :

被测试函数的输入参数;

被测试函数内部需要读取的全局静态变量;

被测试函数内部需要读取的成员变量;

函数内部调用子函数获得的数据;

函数内部调用子函数改写的数据;

嵌入式系统中,在中断调用时改写的数据;

“预计输出”,具体来看有以下几大类:

被测试函数的返回值;

被测试函数的输出参数;

被测试函数所改写的成员变量;

被测试函数所改写的全局变量;

被测试函数中进行的文件更新;

被测试函数中进行的数据库更新;

被测试函数中进行的消息队列更新;

第三,驱动代码,桩代码和Mock代码

驱动代码,桩代码和 Mock 代码,是单元测试中最常出现的三个名词。驱动代码是用来调用被测函数的,而桩代码和 Mock 代码是用来代替被测函数调用的真实代码的。

驱动代码,桩代码和 Mock 代码三者的逻辑关系

驱动代码(Driver)指调用被测函数的代码 ,在单元测试过程中,驱动模块通常包括调用被测函数前的数据准备、调用被测函数以及验证相关结果三个步骤。驱动代码的结构,通常由

单元测试的框架决定。

桩代码(Stub)是用来代替真实代码的临时代码。 比如,某个函数A的内部实现中调用了一个尚未实现的函数B,为了对函数A的逻辑进行测试,那么就需要模拟一个函数B,这个模拟

的函数 B 的实现就是所谓的桩代码。

实际软件项目中如何开展单元测试?

1. 并不是所有的代码都要进行单元测试,通常只有底层模块或者核心模块的测试中才会采用单元测试。

2. 你需要确定单元测试框架的选型,这和开发语言直接相关。比如,Java最常用的单元测试框架是Junit和TestNG;C/C++最常用的单元测试框架是CppTest和Parasoft

C/C++test ;框架选型完成后,你还需要对桩代码框架和 Mock 代码框架选型,选型的主要依据是开发所采用的具体技术栈。

通常,单元测试框架、桩代码 /Mock 代码的选型工作由开发架构师和测试架构师共同决定。

3. 为了能够衡量单元测试的代码覆盖率,通常你还需要引入计算代码覆盖率的工具。不同的语言会有不同的代码覆盖率统计工具,比如Java的JaCoCo,JavaScript的Istanbul。

在后续的文章中,我还会详细为你介绍代码覆盖率的内容。

4. 最后你需要把单元测试执行、代码覆盖率统计和持续集成流水线做集成,以确保每次代码递交,都会自动触发单元测试,并在单元测试执行过程中自动统计代码覆盖率,最后

以 “ 单元测试通过率 ” 和 “ 代码覆盖率 ” 为标准来决定本次代码递交是否能够被接受。

如果你有开发背景,那么入门单元测试是比较容易的。但真正在项目中全面推行单元测试时,你会发现还有一些困难需要克服:

1. 紧密耦合的代码难以隔离;

2. 隔离后编译链接运行困难;

3. 代码本身的可测试性较差,通常代码的可测试性和代码规模成正比;

4. 无法通过桩代码直接模拟系统底层函数的调用;

5. 代码覆盖率越往后越难提高。

总结

我给你详细介绍了单元测试的概念,和你重点讨论了用例的组成,以及在实际项目中开展单元测试的方法,你需要注意以下三个问题:

1. 代码要做到功能逻辑正确,必须做到分类正确并且完备无遗漏,同时每个分类的处理逻辑必须正确;

2. 单元测试是对软件中的最小可测试单元在与软件其他部分相隔离的情况下进行的代码级测试;

3. 桩代码起到了隔离和补齐的作用,使被测代码能够独立编译、链接,并运行。

人工动态方法,可以真正检测代码的业务逻辑功能,其关注点是 “ 什么样的输入,执行了什么代码,产生了什么样的输出 ” ,主要用于发现算法错误和部分算法错误,是最主要的代码

级测试手段。

单元测试中三个最主要的难点:

1. 单元测试用例“输入参数”的复杂性;

2. 单元测试用例“预期输出”的复杂性;

3. 关联依赖的代码不可用。

上一篇下一篇

猜你喜欢

热点阅读