Hi,
我对并发测试的一点见解。
CppUTest从根本上是不支持并发模块的单元测试的,也从来没有针对并发测试而做设计。做不到主要是因为CppUTest很有特色的内存泄露检查,还有mock的实现是不支持并发的(至少目前仍是这样)。如果不使用内存泄露检查和CppUMock的话,理论上来讲是可以支持带并发的测试的。
而CppUTest这样的设计也是有自己的考量的。合理的软件设计中业务逻辑应该由一些高度内聚的“单元“完成的,单元测试尤其擅长对这些内聚体进行测试,而这些内聚体中往往是没有并发的。换句话说,业务逻辑应该与并发逻辑分离开。
如果业务逻辑无法完全同并发逻辑分离开的话(举个例子,业务逻辑是由在两个线程间异步消息传递而完成的),那么在单元测试时用同步实现来模拟并发的话是个好的选择。
那么剩下来的就是针对并发时的时间特性的测试了。说实话,单元测试对此往往无能为力。理由是,并发本身就是把程序的执行和时间解耦开。而具体执行时到底是个什么顺序是由很多外在因素决定的,例如某次内存分配所花的时间、当时cpu的利用率等。单元测试本来就是要在断开与环境之间依赖的情况下进行,所以几乎与真实运行环境不可能一样。而且c/c++单元测试往往和产品不在同一个环境里,甚至不是同一个编译器。
所以我的结论是,
1.并发应与与业务逻辑尽量分离。
2.如果并发中有业务逻辑则用模拟并发的方式做单元测试
3.对并发的保证来自于好的和一致的并发策略,以及与真实环境接近的集成测试和系统测试。