- 命名规范
被测试的对象 | 测试本身要新建的对象 |
---|---|
项目 | 新建一个名为[被测项目].Tests的测试项目 |
类 | 至少为每个被测试类新建一个名为[类名]Tests的类 |
方法 | 至少为每个被测试方法新建一个名为[方法名][测试场景][预期行为]的方法 |
- 单元测试方法主题需要包含的三要素:
- 配置对象,根据需要新建和设置它们
- 操控对象
- 通过断言判断结果是否符合预期
public void IsVaildFileName_validFileLowerCased_ReturnTrue()
{
//arrange
LogAnalyzer analyzer = new LogAnalyzer();
//act
bool result = analyzer.IsValidLogFileName("whatever.slf");
//assert
Assert.IsTrue(result,"filename should be valid!");
}
- 所有的单元测试方法都必须是public void的
- 对异常的验证
Assert.Throws(typeof(ArgumentOutOfRangeException), () => program.DoSomething(-3));
- 标签用法及含义
标签用法 | 含义 |
---|---|
[TestFixture] | 标记此类为单元测试类 |
[Test] | 标记此方法为单元测试方法 |
[SetUp] | 单元测试开始之前调用的方法 |
[TearDown] | 单元测试结束之后调用的方法 |
[Ignore(“这个测试忽略”)] | 忽略某个测试方法 |
[Category(“运行快的测试”)] | 设置测试类别 |
如果被测方法依赖于外部资源又会怎样呢?比如依赖于文件系统、数据库、Web服务或者任何我们很难控制的其他东西。这正是我们开始新建测试桩对象(stub)、伪对象(fake)和模拟对象(mock)的时候
桩对象:测试是无法控制依赖项的返回值或其行为的(比如我们要模拟一个异常)。此时需要桩对象
外部依赖是指在系统中代码与其交互的对象,而且无法对其做人为控制。(最常见的例子是文件系统、线程、内存和时间等)
桩对象是对系统中现有依赖项的一个替代品,可人为控制。通过使用桩对象,无需涉及依赖项,即可直接对代码进行测试。
任何面向对象的问题都可以通过添加一个间接层来解决,除非有太多的间接层。