36
xUnit.net Extensibility Brad Wilson Jim Newkirk

XUnit.net Extensibility Brad Wilson Jim Newkirk. Schedule Assert Extensibility9:00 Before/After Extensibility9:45 Fact Extensibility10:15 BREAK10:45 Fixture

Embed Size (px)

Citation preview

Page 1: XUnit.net Extensibility Brad Wilson Jim Newkirk. Schedule Assert Extensibility9:00 Before/After Extensibility9:45 Fact Extensibility10:15 BREAK10:45 Fixture

xUnit.net ExtensibilityBrad WilsonJim Newkirk

Page 2: XUnit.net Extensibility Brad Wilson Jim Newkirk. Schedule Assert Extensibility9:00 Before/After Extensibility9:45 Fact Extensibility10:15 BREAK10:45 Fixture

Schedule

Assert Extensibility 9:00

Before/After Extensibility 9:45

Fact Extensibility 10:15

BREAK 10:45

Fixture Extensibility 11:00

Runner Extensibility 11:30

Putting it all Together 11:45

Page 3: XUnit.net Extensibility Brad Wilson Jim Newkirk. Schedule Assert Extensibility9:00 Before/After Extensibility9:45 Fact Extensibility10:15 BREAK10:45 Fixture

Assert Extensibility

Page 4: XUnit.net Extensibility Brad Wilson Jim Newkirk. Schedule Assert Extensibility9:00 Before/After Extensibility9:45 Fact Extensibility10:15 BREAK10:45 Fixture

Not Easy to Add New Asserts

Limitations of the platform & language

Provide core assertions with the framework

Keep “assert language” consistent

No differentiation between failure and exceptions

Page 5: XUnit.net Extensibility Brad Wilson Jim Newkirk. Schedule Assert Extensibility9:00 Before/After Extensibility9:45 Fact Extensibility10:15 BREAK10:45 Fixture

Customization of Comparisons

IEquatable / IEqualityComparer Assert.Contains

Assert.Equal

IComparable / IComparer Assert.InRange

Fallback for Contains & Equal

Page 6: XUnit.net Extensibility Brad Wilson Jim Newkirk. Schedule Assert Extensibility9:00 Before/After Extensibility9:45 Fact Extensibility10:15 BREAK10:45 Fixture

Asserts that Return Values

When type is tested Assert.IsAssignableFrom

Assert.IsType

Assert.Throws

When collections are tested Assert.Single

Exception catcher Record.Exception

Page 7: XUnit.net Extensibility Brad Wilson Jim Newkirk. Schedule Assert Extensibility9:00 Before/After Extensibility9:45 Fact Extensibility10:15 BREAK10:45 Fixture

ExampleCompare dates without times

Page 8: XUnit.net Extensibility Brad Wilson Jim Newkirk. Schedule Assert Extensibility9:00 Before/After Extensibility9:45 Fact Extensibility10:15 BREAK10:45 Fixture

ExerciseFinish by 9:45

Page 9: XUnit.net Extensibility Brad Wilson Jim Newkirk. Schedule Assert Extensibility9:00 Before/After Extensibility9:45 Fact Extensibility10:15 BREAK10:45 Fixture

Before/After Extensibility

Page 10: XUnit.net Extensibility Brad Wilson Jim Newkirk. Schedule Assert Extensibility9:00 Before/After Extensibility9:45 Fact Extensibility10:15 BREAK10:45 Fixture

Design

Cross-cutting concerns Reusable attribute

Initializing environment

Cleaning up after stateful tests

Runs regardless of test outcome

Has no access to test class or method

Unspecified order (compose for guarantee)

Page 11: XUnit.net Extensibility Brad Wilson Jim Newkirk. Schedule Assert Extensibility9:00 Before/After Extensibility9:45 Fact Extensibility10:15 BREAK10:45 Fixture

ExampleRollback database

Page 12: XUnit.net Extensibility Brad Wilson Jim Newkirk. Schedule Assert Extensibility9:00 Before/After Extensibility9:45 Fact Extensibility10:15 BREAK10:45 Fixture

Brainstorming ExerciseFinish by 10:15

Page 13: XUnit.net Extensibility Brad Wilson Jim Newkirk. Schedule Assert Extensibility9:00 Before/After Extensibility9:45 Fact Extensibility10:15 BREAK10:45 Fixture

Fact Extensibility

Page 14: XUnit.net Extensibility Brad Wilson Jim Newkirk. Schedule Assert Extensibility9:00 Before/After Extensibility9:45 Fact Extensibility10:15 BREAK10:45 Fixture

Design

Answers: “What is a test method?” Enumeration of tests

Execution of tests

Metadata (skip, timeout, display name)

Page 15: XUnit.net Extensibility Brad Wilson Jim Newkirk. Schedule Assert Extensibility9:00 Before/After Extensibility9:45 Fact Extensibility10:15 BREAK10:45 Fixture

Why?

Metadata changes “I want all my tests to have a timeout”

“I want the display name of my test to be something other than method name”

Enumeration changes “I want this test method to be run many times, perhaps with

different input values for each run”

Execution changes “I want to do something different than just running the

method with no parameters”

Page 16: XUnit.net Extensibility Brad Wilson Jim Newkirk. Schedule Assert Extensibility9:00 Before/After Extensibility9:45 Fact Extensibility10:15 BREAK10:45 Fixture

Example[Theory] attribute

Page 17: XUnit.net Extensibility Brad Wilson Jim Newkirk. Schedule Assert Extensibility9:00 Before/After Extensibility9:45 Fact Extensibility10:15 BREAK10:45 Fixture

ExerciseFollowed by break, back by 11:00

Page 18: XUnit.net Extensibility Brad Wilson Jim Newkirk. Schedule Assert Extensibility9:00 Before/After Extensibility9:45 Fact Extensibility10:15 BREAK10:45 Fixture

Fixture Extensibility

Page 19: XUnit.net Extensibility Brad Wilson Jim Newkirk. Schedule Assert Extensibility9:00 Before/After Extensibility9:45 Fact Extensibility10:15 BREAK10:45 Fixture

IUseFixture

Share reusable fixture setup and teardown Constructor

Dispose

Most frameworks encourage base classes here Lack of multiple inheritance in the CLR

“Inherit to be reused, not to reuse”

Page 20: XUnit.net Extensibility Brad Wilson Jim Newkirk. Schedule Assert Extensibility9:00 Before/After Extensibility9:45 Fact Extensibility10:15 BREAK10:45 Fixture

ExampleTest data seed & cleanup

Page 21: XUnit.net Extensibility Brad Wilson Jim Newkirk. Schedule Assert Extensibility9:00 Before/After Extensibility9:45 Fact Extensibility10:15 BREAK10:45 Fixture

ITestClassCommand and RunWith

Answers: “What is a test class?” Pre- and post-fixture behavior

Pre- and post-test behavior

Test class creation & cleanup

Test method discovery

Test method ordering

Page 22: XUnit.net Extensibility Brad Wilson Jim Newkirk. Schedule Assert Extensibility9:00 Before/After Extensibility9:45 Fact Extensibility10:15 BREAK10:45 Fixture

ExampleRemove Randomization

Page 23: XUnit.net Extensibility Brad Wilson Jim Newkirk. Schedule Assert Extensibility9:00 Before/After Extensibility9:45 Fact Extensibility10:15 BREAK10:45 Fixture

ExerciseFinish by 11:30

Page 24: XUnit.net Extensibility Brad Wilson Jim Newkirk. Schedule Assert Extensibility9:00 Before/After Extensibility9:45 Fact Extensibility10:15 BREAK10:45 Fixture

Runner Extensibility

Page 25: XUnit.net Extensibility Brad Wilson Jim Newkirk. Schedule Assert Extensibility9:00 Before/After Extensibility9:45 Fact Extensibility10:15 BREAK10:45 Fixture

Design

Version resilient runner APIs

Link against xunit.runner.utility.dll, not xunit.dll

Test assembly lives in a separate app domain Assembly

Configuration File

(Optional) Shadow Copy

Page 26: XUnit.net Extensibility Brad Wilson Jim Newkirk. Schedule Assert Extensibility9:00 Before/After Extensibility9:45 Fact Extensibility10:15 BREAK10:45 Fixture

Low-Level API

Exector (remote)

ExecutorWrapper (local)

On the wire, it’s: XML as a string (for status)

Boolean continue flag (to cancel)

Don’t use this.

Page 27: XUnit.net Extensibility Brad Wilson Jim Newkirk. Schedule Assert Extensibility9:00 Before/After Extensibility9:45 Fact Extensibility10:15 BREAK10:45 Fixture

High-Performance API

Thin wrapper on top of ExecutorWrapper TestRunner

TestRunnerResult

IRunnerLogger

Cracks the XML into simple values

Not stateful; callback is mandatory

Runners: MSBuild, TD.NET, Resharper

Page 28: XUnit.net Extensibility Brad Wilson Jim Newkirk. Schedule Assert Extensibility9:00 Before/After Extensibility9:45 Fact Extensibility10:15 BREAK10:45 Fixture

Object-Oriented API

Object model on top of ExecutorWrapper MultiAssemblyTestEnvironment

TestAssembly, TestClass, TestMethod

TestStatus

ITestMethodRunnerCallback

Cracks the XML into objects

Stateful; callback is optional

Runners: Console, GUI

Page 29: XUnit.net Extensibility Brad Wilson Jim Newkirk. Schedule Assert Extensibility9:00 Before/After Extensibility9:45 Fact Extensibility10:15 BREAK10:45 Fixture

Project files (.xunit)

One or more assemblies

Output types & locations

Filters

Page 30: XUnit.net Extensibility Brad Wilson Jim Newkirk. Schedule Assert Extensibility9:00 Before/After Extensibility9:45 Fact Extensibility10:15 BREAK10:45 Fixture

Examplexunit.console

Page 31: XUnit.net Extensibility Brad Wilson Jim Newkirk. Schedule Assert Extensibility9:00 Before/After Extensibility9:45 Fact Extensibility10:15 BREAK10:45 Fixture

Putting it all Together

Page 32: XUnit.net Extensibility Brad Wilson Jim Newkirk. Schedule Assert Extensibility9:00 Before/After Extensibility9:45 Fact Extensibility10:15 BREAK10:45 Fixture

ExampleBDD with [Observation]

Page 33: XUnit.net Extensibility Brad Wilson Jim Newkirk. Schedule Assert Extensibility9:00 Before/After Extensibility9:45 Fact Extensibility10:15 BREAK10:45 Fixture

ExampleBDD with SubSpec

Page 34: XUnit.net Extensibility Brad Wilson Jim Newkirk. Schedule Assert Extensibility9:00 Before/After Extensibility9:45 Fact Extensibility10:15 BREAK10:45 Fixture

ExampleAmalga Best Practice Analyzer

Page 35: XUnit.net Extensibility Brad Wilson Jim Newkirk. Schedule Assert Extensibility9:00 Before/After Extensibility9:45 Fact Extensibility10:15 BREAK10:45 Fixture

Exercise

Page 36: XUnit.net Extensibility Brad Wilson Jim Newkirk. Schedule Assert Extensibility9:00 Before/After Extensibility9:45 Fact Extensibility10:15 BREAK10:45 Fixture

Thank You!http://xunit.codeplex.com/

@bradwilson @jamesnewkirk @xunit