C++中多线程/异步的代码的单元测试程序应该如何写?

来源:
2020-04-21
1
5
5

比如说异步的代码,在回调中检查,可是单测程序已经退出。


收藏
点赞
2000
  • 张晓雷

    这个问题反映了开发人员在理解单元测试和如何做单元测试时的普遍误区,也反映了在实际的单元测试执行过程中可能遭遇的一系列困难。 首先,我们需要明确什么是单元测试,它的测试目标是什么。 单元测试是指对软件中的最小可测试单元进行检查和验证。这里的最小单元可以根据不同情况进行划分,比如C语言中的一个函数,java中的一个类,或者图形界面的一个部件等。 单元测试是在软件开发验证过程的底层和早期进行的测试活动,目的是为了把缺陷消灭在萌芽状态。这个时候,一个独立单元必须能在不依赖于软件其他部分进行测试。为此我们在没有具体的外部实现下对相应的功能进行模拟,比如对函数单元中调用的一个外部函数用桩函数进行替代,或者在面向对象语言中采用mock对象模拟一个外部类的实现。 【引用部分】 单元测试也被归为一种白盒测试,它一般是由开发人员根据单元内部具体实现来构造的,通常会将代码覆盖率作为单元测试的核心指标之一,包括sqlite在内很多著名开源软件都会标明其单元测试的覆盖率达到了100%。而一旦进入到黑盒测试阶段,就很难构造出足够用例来满足这样的覆盖率指标。这是各种软件开发测试流程中都会把单元测试和其后续的集成测试进行明确划分的一个因素。大部分的现代开发环境中,都会包含有生成覆盖率数据或报告的工具,比如GCC工具链中提供了gcov命令来帮助生成覆盖率统计所需的程序执行信息以及最终覆盖率。具体程序执行覆盖数据的表示形式和统计方法欢迎关注我们作进一步了解。 【引用结束】 简单而言,单元测试依赖的是数据而不是特定功能的具体实现。但是在实际进行的大部分商业项目中会存在以下的制约因素:一、由于时间人手上的限制,很难做到通过一一构建桩函数和mock对象的方式来对外部功能进行模拟;二、对一个单元的开发人员而言,缺少意愿仅仅为测试一个很小的功能构造大量的包含琐碎细节的测试用例;三、除了面向专业测试领域的商业产品外,面向开发人员所提供的开源单元测试框架中一般缺少类似构建桩函数,mock对象和测试用例数据的辅助设施。因此,很多开发人员口中的单元测试实际上是对一个相对较小的功能模块进行测试,这在严格意义上应该归为集成测试的范畴,或者称为功能单元测试,因为它只考虑到比较明确的功能需求,而没有以覆盖率作为指标。即使是思考缜密的成熟开发人员也可能并没有对编码中出现的大量异常处理部分没有进行周密的测试。考虑到这一部分测试可能仍然只能由开发人员对照代码来实现,不那么严格的话,也可以归于广义上的单元测试(白盒测试)的范畴。 回到题目,测试一个多线程/异步过程必然离不开对系统函数的调用以及线程具体实现的依赖,显然这已经远远超出了严格意义上单元测试所能覆盖到的范围(除非这个测试本身的目的是创建线程这样的功能,但这往往是系统或者成熟的三方库来提供的)。

    2020-04-21
    回复
    点赞