如何才是一个好的单元测试
好的测试应该具有的品质是:A-TRIP(合称)
——Automatic 自动化
——Thorough 彻底的
——Repeatable可重复
——Independent独立的
——Professional 专业的
● Automatic自动化:调用自动化、检查结果自动化
● Thorough 彻底的
测试所有可能会出现问题的情况,一个极端是,对于每行代码、代码可能到达的分支,每个可能抛出的异常等等,都可以作为测试的对象。另一个极端是,你仅仅测试最可能的情况---边界条件、残缺和畸形的数据等等。然而这些都基于项目需求的决策问题。
这些所说的归纳为“代码覆盖率”。
● Repeatable 可重复
测试应该独立于所有其他的测试,而且必须独立于周围的环境。目标只有一个,就是测试应该能够以任意的顺序一次又一次的运行,并且产生相同的结果。如果结果不同,则存在BUG。
● Independent 独立的
编写测试时,确保一次只测试了一样东西,但并不表示一个TestMethod内只能使用一个Assert,而是一个测试函数应该专注于产品代码中的一个函数,或者组合起来并共同提供某个特性的一组函数。
● Professional 专业的
测试代码必须同产品代码相同的风格来编写。这意味着你需要抽取出共同且重复的代码,并把它们放到一个功能类之中,从而可以复用;单元测试的代码一样讲究------维护封装,DRY原则,降低耦合。
何时需要Mock对象
● 真实对象具有不可确定的行为(产生不可预测的结果,如股票的行情)
● 真实对象很难被创建(比如具体的web容器)
● 真实对象的某些行为很难触发(比如网络错误)
● 真实情况令程序的运行速度很慢
● 真实对象有用户界面
● 测试需要询问真实对象它是如何被调用的(比如测试可能需要验证某个回调函数是否被调用了)
● 真实对象实际上并不存在(当需要和其他开发小组,或者新的硬件系统打交道的时候,这是一个普遍的问题)
Mock对象的三个步骤
1. 原型
ClassA调用 ClassB的Method()
2. 使用一个接口来描述这个对象
ClassA 通过接口调用ClassB的Method
3. 以测试为目的,在mock对象中实现这个接口