These are the contents of my training session about unit testing, and also have some introductions about how could we write better unit tests with NSubstitute framework.

The related sessions:

Agenda

Unit Testing Introduction

Unit Testing Classic Definition

A unit test is a piece of a code (usually a method) that invokes another piece of code and checks the correctness of some assumptions afterward. If the assumptions turn out to be wrong, the unit test has failed. A “unit” is a method or function. In OOP, a “unit” is often an entire interface, such as class, but could be an individual method.
  -- from Wikipedia
Kent Beck introduced the concept of unit testing in Smalltalk.

Why Unit Testing?

  • Find Problems Early

    • Find problems in development cycle.
  • Facilitate Changes
    • Allow programmer to refactor code at a later date.
  • Simplify Integration
    • Reduce uncertainty, reduce efforts from integration test.
  • Documentation
    • Sort of living documentation of system.
  • Design by Test Driven
    • Support TDD approach.

Properties of a good unit test

A unit test should have the following properties:
  • It should be automated and repeatable.
  • It should be easy to implement.
  • Once it’s written, it should remain for future use.
  • Anyone should be able to run it.
  • It should run at the push of a button.
  • It should run quickly.

Unit Testing Good Definition

A unit test is an automated piece of code that invokes the method or class being tested and then checks some assumptions about the logical behavior of that method or class. A unit test is almost always written using a unit-testing framework. It can be written easily and runs quickly. It’s fully automated, trustworthy, readable, and maintainable.

What's Logical Behavior?

Logical code is any piece of code that has some sort of logic in it, small as it may be. It’s logical code if it has one or more of the following: an IF statement, a loop, switch or case statements, calculations, or any other type of decision-making code.

Verification Patterns -- State

  • State Verification, also known as State-based Testing.

    • We inspect the state of the system under test (SUT) after it has been exercised and compare it to the expected state.
 

Verification Patterns -- Behavior

  • Behavior Verification, also known as Interaction Testing.

    • We capture the indirect outputs of the SUT as they occur and compare them to the expected behavior.
 

Simple Example

Code:

 
Test:
 
 

TDD: Test-Driven Development

When to write the tests?

  1. Write a failing test to prove code or functionality is missing from the end product. (RED)
  2. Make the test pass by writing production code that meets the expectations of your test. (GREEN)
  3. Refactor your code. (REFACTOR)

Define TDD Paradigm

TAD: Test After Development

  • Are we TDD-style?

    • No, we are TAD now.
  • Must we do TDD-style coding?
    • No, TDD is a style choice. You can make your own choice.

Unit Testing Frameworks

Framework for Unit Testing

Unit testing frameworks are code libraries and modules that help developers unit-test their code. And also help running the tests as part of an automated build.

What Unit Testing Framework Offer

  • Write tests easily and in a structured manner.

    • Base classes or interfaces to inherit.
    • Attributes to place in code to note the tests to run.
    • Assert classes.
  • Execute one or all of the unit tests.
    • Identify tests in your code.
    • Run tests automatically.
    • Indicate status while running.
  • Review the result of the test runs.
    • Red/Green

xUnit architecture

  • Test Fixtures
  • Test Cases
  • Test Suites
  • Test Execution
  • Assertions

List of Unit Testing Frameworks

Integrated with Automated Build

  • With MSBuild.

    • <RunTest>true</RunTest>
    • <TestContainer Include="UT*.dll"/>

Unit Testing Patterns

Record – Replay – Verify Model

A model that allows for recording actions on a mock object and then replaying and verifying them.

Arrange – Act – Assert Pattern

  • "Arrange-Act-Assert" is a pattern for arranging and formatting code in UnitTest methods.

    • Each method should group these functional sections, separated by blank lines:
      1. Arrange all necessary preconditions and inputs.
      2. Act on the object or method under test.
      3. Assert that the expected results have occurred.

Unit Testing Mocking Libraries

Mocking Library

A mocking library is a set of programmable APIs that make creating mock and stub objects much easier. Mocking libraries save the developer from the need to write repetitive code to test or simulate object interactions.

Other names:

  • Mocking framework
  • Isolation framework

Most Features of Mocking Library

  • No Record/Replay idioms to learn.
  • Very low learning curve. Don't even need to read the documentation.
  • No need to learn what's the theoretical difference between a mock, a stub, a fake, a dynamic mock, etc.
  • Strong-typed, no object-typed return values or constraints.
  • Mock both interfaces and classes.
  • Override expectations as needed on tests.
  • Pass constructor arguments for mocked classes.
  • Intercept and raise events on mocks.
  • Intuitive support for out/ref arguments.

Famous Mocking Libraries

  • NSubstitute
  • Moq
  • Rhino Mocks
  • Microsoft Fakes
  • NMock
  • EasyMock.NET
  • TypeMock Isolator
  • JustMock
  • FakeItEasy

The Values of a Good Mocking Library

  • Simple to use. For example, a single point of entry in the API, easy to remember API, or Intelligence guidance.
  • Test Robustness. Making sure the test can live as long as possible while the system changes, and it only breaks when something important to it changes. Things like recursive fakes help a lot there. So does being non strict by default.
  • Helpful. If something is wrong, the user should not feel stupid. Helpful error messages go a long way. Being specific and not surprising the user as much as possible.

Mocking Libraries Comparison

-- Roy Osherove, the author of “The Art of Unit Testing”

Why we choose NSubstitute?

Why We Choose NSubstitute?

  • Simple, succinct, pleasant to use.
  • Helpful exceptions.
  • Don't sweat the small stuff.
    • Mock, stub, fake, spy, test double? Nah, just substitute for the type you need!

NSubstitute Features & Demos

Creating a substitute

Setting a return value

Return for any args

Return from a function

Argument matchers

Replacing return values

Check received calls

Callbacks, When..Do

Throwing exceptions

Raising events

References

Unit Testing with NSubstitute的更多相关文章

  1. [Java Basics3] XML, Unit testing

    What's the difference between DOM and SAX? DOM creates tree-like representation of the XML document ...

  2. Javascript单元测试Unit Testing之QUnit

    body{ font: 16px/1.5em 微软雅黑,arial,verdana,helvetica,sans-serif; }           QUnit是一个基于JQuery的单元测试Uni ...

  3. [Unit Testing] AngularJS Unit Testing - Karma

    Install Karam: npm install -g karma npm install -g karma-cli Init Karam: karma init First test: 1. A ...

  4. C/C++ unit testing tools (39 found)---reference

    http://www.opensourcetesting.org/unit_c.php API Sanity AutoTest Description: An automatic generator ...

  5. Unit testing Cmockery 简单使用

    /********************************************************************** * Unit testing Cmockery 简单使用 ...

  6. Unit Testing a zend-mvc application

    Unit Testing a zend-mvc application A solid unit test suite is essential for ongoing development in ...

  7. Unit Testing PowerShell Code with Pester

    Summary: Guest blogger, Dave Wyatt, discusses using Pester to analyze small pieces of Windows PowerS ...

  8. MVC Unit Testing学习笔记

    MVC Unit Testing 参考文档: 1.http://www.asp.net/mvc/overview/testing 2.http://www.asp.net/mvc/tutorials/ ...

  9. 读书笔记-实用单元测试(英文版) Pragmatic Unit Testing in C# with NUnit

    读书笔记-实用单元测试(英文版) Pragmatic Unit Testing in C# with NUnit Author: Andrew Hunt ,David Thomas with Matt ...

随机推荐

  1. CozyRSS开发记录9-快速实现一个RSS解析器

    CozyRSS开发记录9-快速实现一个RSS解析器 1.再读RSS标准 既然需要自己实现一个RSS解析器,那自然需要仔细的读一读RSS的标准文档.在网上随便找了两份,一份英文一份中文: http:// ...

  2. 结合谷歌地图多边形(polygon)与Sql Server 2008的空间数据类型计算某个点是否在多边形内的注意事项

    首先在利用 GEOGRAPHY::STPolyFromText(@GeoStr, 4326) 这样的函数把字符串转换为Geography类型时,字符串里经纬度的顺序是 “经度[空格]纬度”,即“lon ...

  3. jq冒泡之——点击其他地方隐藏

    e.stopPropagetion(); <!DOCTYPE html> <html lang="en"> <head> <meta ch ...

  4. 动态更换应用Icon

    转:原理1--activity-alias 在AndroidMainifest中,有两个属性: // 决定应用程序最先启动的Activity android.intent.action.MAIN // ...

  5. 《DSP using MATLAB》示例Example5.21

  6. IDE-Sublime【3】-配置Node.js开发环境

    一.下载Nodejs插件,下载地址为https://github.com/tanepiper/SublimeText-Nodejs,解压到当前文件夹,改名为Nodejs 二.打开Sublime Tex ...

  7. unity3D项目中如何避免硬代码(C#)

    平时做项目,代码中是不允许出现硬代码的,一般我们是怎么处理的呢? 那么硬代码又是什么呢? 我们俗称的硬代码:eg:   label.text = "欢迎来到梦幻岛";  这样我们俗 ...

  8. Python框架之Tornado(二)请求阶段

    概述 上图是tornado程序启动以及接收到客户端请求后的整个过程,对于整个过程可以分为两大部分: 启动程序阶段,又称为待请求阶段(上图1.2所有系列和3.0) 接收并处理客户端请求阶段(上图3系列) ...

  9. 干货!IT小伙伴们实用的网站及工具大集合!持续更新!

    1.Git 还在担心自己辛辛苦苦写的代码被误删了吗?还在担心自己改错了代码不能挽回吗?还在苦恼于多人开发合作找不到一个好的工具吗?那么用Git就对 了,Git是一个开源的分布式版本控制系统,用以有效. ...

  10. Eclipse 双击变量,其他相同变量有底色

    转载:http://blog.csdn.net/majian_1987/article/details/46691697 方便下次查找. 在Eclipse中,鼠标选中或者光标移动到Java类的变量名时 ...