55
The Path to Unit Testing

Wes McClure [email protected] [email protected] [email protected] [email protected] @g0t4

Embed Size (px)

Citation preview

Page 1: Wes McClure  wes.mcclure@gmail.com wes.mcclure@gmail.com  wmcclure@phxwg.com wmcclure@phxwg.com  @g0t4

The Path to Unit Testing

Page 3: Wes McClure  wes.mcclure@gmail.com wes.mcclure@gmail.com  wmcclure@phxwg.com wmcclure@phxwg.com  @g0t4

Poll – How do you test?

Manual Testing Automated Testing QA? Deploy and unplug the phone!

Page 4: Wes McClure  wes.mcclure@gmail.com wes.mcclure@gmail.com  wmcclure@phxwg.com wmcclure@phxwg.com  @g0t4

Agenda

Before Testing Unit Testing Frameworks Dependencies Legacy Testing Good Testing

Page 5: Wes McClure  wes.mcclure@gmail.com wes.mcclure@gmail.com  wmcclure@phxwg.com wmcclure@phxwg.com  @g0t4

Before Testing

Page 6: Wes McClure  wes.mcclure@gmail.com wes.mcclure@gmail.com  wmcclure@phxwg.com wmcclure@phxwg.com  @g0t4

Scenario

Weather on company portal. NOAA web service Input zip code Get latitude / longitude Show weather forecast

Page 7: Wes McClure  wes.mcclure@gmail.com wes.mcclure@gmail.com  wmcclure@phxwg.com wmcclure@phxwg.com  @g0t4

Where to start?

Build a Prototype? Console app

Move into web app

Page 8: Wes McClure  wes.mcclure@gmail.com wes.mcclure@gmail.com  wmcclure@phxwg.com wmcclure@phxwg.com  @g0t4

Ok Done!

What is done? Hanselminutes #119

Tested?

 Time Detected

Requirements

Architecture

Construction

System Test

Post-Release

Time Introduced

Requirements 1× 3× 5–10× 10× 10–100×Architecture - 1× 10× 15× 25–100×Construction - - 1× 10× 10–25×

Page 9: Wes McClure  wes.mcclure@gmail.com wes.mcclure@gmail.com  wmcclure@phxwg.com wmcclure@phxwg.com  @g0t4

It was tested … manually

How? Run program Provide input Execute action Subjectively verify output

Page 10: Wes McClure  wes.mcclure@gmail.com wes.mcclure@gmail.com  wmcclure@phxwg.com wmcclure@phxwg.com  @g0t4

Problems with Manual

Thrown away In the noggin

Not documented Easily forgotten

Documented Refactorability

Easy paths 1 bug fixed = 2 new

Page 11: Wes McClure  wes.mcclure@gmail.com wes.mcclure@gmail.com  wmcclure@phxwg.com wmcclure@phxwg.com  @g0t4

How can I fix this?

Automate

Page 12: Wes McClure  wes.mcclure@gmail.com wes.mcclure@gmail.com  wmcclure@phxwg.com wmcclure@phxwg.com  @g0t4

Unit Testing

Definition (wikipedia) Is a software verification and validation

method in which a programmer tests if individual units of source code are fit for use. A unit is the smallest testable part of an application. … in object-oriented programming, the smallest unit is a class…

Testing the smallest piece

Page 13: Wes McClure  wes.mcclure@gmail.com wes.mcclure@gmail.com  wmcclure@phxwg.com wmcclure@phxwg.com  @g0t4

Unit Test Composition

AAA Arrange (Given) Act (When) Assert (Then)

Same as manual template

Page 14: Wes McClure  wes.mcclure@gmail.com wes.mcclure@gmail.com  wmcclure@phxwg.com wmcclure@phxwg.com  @g0t4

States

Passing Failing Not Run

Page 15: Wes McClure  wes.mcclure@gmail.com wes.mcclure@gmail.com  wmcclure@phxwg.com wmcclure@phxwg.com  @g0t4

Questions?

Before Testing

Page 16: Wes McClure  wes.mcclure@gmail.com wes.mcclure@gmail.com  wmcclure@phxwg.com wmcclure@phxwg.com  @g0t4

Unit Testing Frameworks

Page 17: Wes McClure  wes.mcclure@gmail.com wes.mcclure@gmail.com  wmcclure@phxwg.com wmcclure@phxwg.com  @g0t4

Test Discovery

Inheritance Naming ConvetionsAttributes

Page 18: Wes McClure  wes.mcclure@gmail.com wes.mcclure@gmail.com  wmcclure@phxwg.com wmcclure@phxwg.com  @g0t4

NUnit Test Discovery

Basic Attributes TestFixture Test Ignore Category

Page 19: Wes McClure  wes.mcclure@gmail.com wes.mcclure@gmail.com  wmcclure@phxwg.com wmcclure@phxwg.com  @g0t4

Test Execution

Exectuion Selection Run Results (State)

Types Console GUI IDE Integrated

Page 20: Wes McClure  wes.mcclure@gmail.com wes.mcclure@gmail.com  wmcclure@phxwg.com wmcclure@phxwg.com  @g0t4

NUnit Test Execution

Runners Console GUI MiniGUI

IDE Integrated TestDriven.Net R# Test Runner Gallio

Page 21: Wes McClure  wes.mcclure@gmail.com wes.mcclure@gmail.com  wmcclure@phxwg.com wmcclure@phxwg.com  @g0t4

Assertions

Classic Fluent

“Fluent is the new xml”

Page 22: Wes McClure  wes.mcclure@gmail.com wes.mcclure@gmail.com  wmcclure@phxwg.com wmcclure@phxwg.com  @g0t4

NUnit Assertion Syntax

Classic Assertions Fluent Constraints AssertionHelper

Expect Constraints

Is Has Throws

Page 23: Wes McClure  wes.mcclure@gmail.com wes.mcclure@gmail.com  wmcclure@phxwg.com wmcclure@phxwg.com  @g0t4

Putting it all together

Hello World Test

Page 24: Wes McClure  wes.mcclure@gmail.com wes.mcclure@gmail.com  wmcclure@phxwg.com wmcclure@phxwg.com  @g0t4

More NUnit Attributes

Page 25: Wes McClure  wes.mcclure@gmail.com wes.mcclure@gmail.com  wmcclure@phxwg.com wmcclure@phxwg.com  @g0t4

SetUp & TearDown

Per Test Once for Test Fixture Once for Namespace

Cautious

Page 26: Wes McClure  wes.mcclure@gmail.com wes.mcclure@gmail.com  wmcclure@phxwg.com wmcclure@phxwg.com  @g0t4

Parameterized Tests

TestCase Result TestName

Theory DataPoint

Caution

Page 27: Wes McClure  wes.mcclure@gmail.com wes.mcclure@gmail.com  wmcclure@phxwg.com wmcclure@phxwg.com  @g0t4

Attributes to Avoid

Random Tests should be repeatable!

Sequential Tests shouldn’t be interdependent!

Repeat Win the lottery?

Page 28: Wes McClure  wes.mcclure@gmail.com wes.mcclure@gmail.com  wmcclure@phxwg.com wmcclure@phxwg.com  @g0t4

Other attributes

Localization Culture SetCulture

Labeling Description Suite Property

Parametric Attributes▪ Values▪ ValueSource▪ Range

Combinatorial Pairwise TestCaseSource

Timing (async) MaxTime Timeout

Threading RequiresMTA RequiresSTA RequiresThread

Others Explicit RequiredAddIn Suite ExpectedException Platform

Page 29: Wes McClure  wes.mcclure@gmail.com wes.mcclure@gmail.com  wmcclure@phxwg.com wmcclure@phxwg.com  @g0t4

Questions?

Unit Testing Frameworks (with NUnit)

Page 30: Wes McClure  wes.mcclure@gmail.com wes.mcclure@gmail.com  wmcclure@phxwg.com wmcclure@phxwg.com  @g0t4

Dependenciesanother word for "testable" is "decoupled"

Page 31: Wes McClure  wes.mcclure@gmail.com wes.mcclure@gmail.com  wmcclure@phxwg.com wmcclure@phxwg.com  @g0t4

Dependencies

Page 32: Wes McClure  wes.mcclure@gmail.com wes.mcclure@gmail.com  wmcclure@phxwg.com wmcclure@phxwg.com  @g0t4

Weather Dependencies

Input to SUT Acted upon

Page 33: Wes McClure  wes.mcclure@gmail.com wes.mcclure@gmail.com  wmcclure@phxwg.com wmcclure@phxwg.com  @g0t4

Unit Testing with Dependencies

Unit Testing => Isolated Unit Stubs

Simulate Dependencies Return Dummy Data

Mocks Record Calls

Page 34: Wes McClure  wes.mcclure@gmail.com wes.mcclure@gmail.com  wmcclure@phxwg.com wmcclure@phxwg.com  @g0t4

Manual Stubs & Mocks

Roll our own

Cons Low reuse Boilerplate Complex

logic

Page 35: Wes McClure  wes.mcclure@gmail.com wes.mcclure@gmail.com  wmcclure@phxwg.com wmcclure@phxwg.com  @g0t4

Poll

Who has used an isolation framework?

Page 36: Wes McClure  wes.mcclure@gmail.com wes.mcclure@gmail.com  wmcclure@phxwg.com wmcclure@phxwg.com  @g0t4

Isolation Frameworks

Dynamic stubs Proxies Setup results

Dynamic mocks Record calls Verification syntax

Example

Page 37: Wes McClure  wes.mcclure@gmail.com wes.mcclure@gmail.com  wmcclure@phxwg.com wmcclure@phxwg.com  @g0t4

Isolation Frameworks

Rhino.Mocks TypeMock Moq NMock2

Page 38: Wes McClure  wes.mcclure@gmail.com wes.mcclure@gmail.com  wmcclure@phxwg.com wmcclure@phxwg.com  @g0t4

Questions?

Page 39: Wes McClure  wes.mcclure@gmail.com wes.mcclure@gmail.com  wmcclure@phxwg.com wmcclure@phxwg.com  @g0t4

Legacy Testing

Page 40: Wes McClure  wes.mcclure@gmail.com wes.mcclure@gmail.com  wmcclure@phxwg.com wmcclure@phxwg.com  @g0t4

Define Legacy

Old Untested – Michael Feathers Missing seams

Page 41: Wes McClure  wes.mcclure@gmail.com wes.mcclure@gmail.com  wmcclure@phxwg.com wmcclure@phxwg.com  @g0t4

Why Change Legacy Code?

Fix Bugs Repeats

Add Features Integrated Isolated

Improve Design 80/20

Improve Moral

Page 42: Wes McClure  wes.mcclure@gmail.com wes.mcclure@gmail.com  wmcclure@phxwg.com wmcclure@phxwg.com  @g0t4

Fixing Bugs

Example

Page 43: Wes McClure  wes.mcclure@gmail.com wes.mcclure@gmail.com  wmcclure@phxwg.com wmcclure@phxwg.com  @g0t4

Legacy Testing

@martinfowler

@ JoshuaKerievsky

Page 44: Wes McClure  wes.mcclure@gmail.com wes.mcclure@gmail.com  wmcclure@phxwg.com wmcclure@phxwg.com  @g0t4

Questions?

Legacy Testing

Page 45: Wes McClure  wes.mcclure@gmail.com wes.mcclure@gmail.com  wmcclure@phxwg.com wmcclure@phxwg.com  @g0t4

Good Unit Tests

Page 46: Wes McClure  wes.mcclure@gmail.com wes.mcclure@gmail.com  wmcclure@phxwg.com wmcclure@phxwg.com  @g0t4

But…

Anything can be done but it takes effort to do it well!

Consistency in choices Best PracticesTry alternatives

Page 47: Wes McClure  wes.mcclure@gmail.com wes.mcclure@gmail.com  wmcclure@phxwg.com wmcclure@phxwg.com  @g0t4

Good Unit Tests

From “The Art of Unit Testing” Readable Maintainable Trustworthy

For us and others

@RoyOsherovehttp://www.artofunittesting.com/http://weblogs.asp.net/ROsherove/

Page 48: Wes McClure  wes.mcclure@gmail.com wes.mcclure@gmail.com  wmcclure@phxwg.com wmcclure@phxwg.com  @g0t4

Readability

Naming Convention Method_Scenario_Expectation Explicit Variables

▪ Call stubs & mocks as such!

Fluent Assertions

var

Page 49: Wes McClure  wes.mcclure@gmail.com wes.mcclure@gmail.com  wmcclure@phxwg.com wmcclure@phxwg.com  @g0t4

Readability

AAA Physical Separate

Page 50: Wes McClure  wes.mcclure@gmail.com wes.mcclure@gmail.com  wmcclure@phxwg.com wmcclure@phxwg.com  @g0t4

Readability

Single Assertion SRP methods

Transfer? Credit Debit Insufficient funds Transactional Success / Failure Auditing

Page 51: Wes McClure  wes.mcclure@gmail.com wes.mcclure@gmail.com  wmcclure@phxwg.com wmcclure@phxwg.com  @g0t4

Readability - Organized

Separate Tests project. Per app or project

1+ TestFixture Per class

1+ Test Per method

Page 52: Wes McClure  wes.mcclure@gmail.com wes.mcclure@gmail.com  wmcclure@phxwg.com wmcclure@phxwg.com  @g0t4

Maintainable

Fast Automated Zero Configuration IDE Integration Continuous Integration

DRY Factories

Independent

Page 53: Wes McClure  wes.mcclure@gmail.com wes.mcclure@gmail.com  wmcclure@phxwg.com wmcclure@phxwg.com  @g0t4

Trustworthy

RepeatableRetainedVersionedConfident

Page 54: Wes McClure  wes.mcclure@gmail.com wes.mcclure@gmail.com  wmcclure@phxwg.com wmcclure@phxwg.com  @g0t4

Resources

Uncle Bob Martin @unclebobmartin butunclebob.com

Podcasts (search for terms in archives) Hanselminutes▪ 169 - Roy Osherove▪ 119 – Unit Test Frameworks

DotNetRocks Test_Review_Guidelines (The Art of Unit

Testing)

Page 55: Wes McClure  wes.mcclure@gmail.com wes.mcclure@gmail.com  wmcclure@phxwg.com wmcclure@phxwg.com  @g0t4

Questions?

Good Unit Tests