这一问题的引出是来自我们的软件发布流程的。我们的产品运行的是Monta Vista或是WindRiver Linux(后面称之为目标环境),而开发环境是Fedora Linux(后面称之为主机环境)。我们对于单元测试都会在主机环境上完成,然后,在目标环境上并不做单元测试,而只是做Sanity Test(你可以理解为功能测试)。一开始,我并没有发现我们在发布产品前并不在目标环境下做单元测试的,后来无意的交谈中我发现了这一与我所想像的不一致的现象,即,我认为产品在发布前应当在目标环境下做单元测试。
说到这,有人可能会想,单元测试应当一旦做过,证明了其正确性,为什么还要在这里所说的目标环境下再做测试呢?是的,这一问题也同样出自于我们的一个软件工程师。在问我的当时,我并没有想好如何回答。于是,在开车回家的路上,我在思考“这是一个对于单元测试的理解比较普遍的问题,如何去表述让别人一下子能明白单元测试还得在目标环境中再做”。思考的结果是这里要提出的代码的动态和静态行为概念。
动态行为是指代码具有一定的响应能力的行为,比如,一个对于线程进行封装的类,其行为应当是动态的。另一个例子,是Socket通讯问题,我们需要对连接进行测试,此时其所表现出来的也是动态行为。对于动态行为的代码,其在不同的操作系统中表现有可能是不同的。
与动态行为不同的是,静态行为只是被动的计算或是组织数据结构。比如,一个MD5的计算函数,其行为是静态的,这种行为不论你是在任何操作系统或是处理器上运行,其结果都是一样的。
有了这两个概念,我不知是不是有助于我们去分析,我们所写的代码是否应当在不同的环境下做单元测试。借用这两个述语我们得到如下的陈述:如果全部代码都只有静态行为,那么只要在一种环境下做单元测试行了;如果代码包括动态行为,那么我们必须在所有可能运行的环境下做单元测试。