asp.net core dependency injection & unit testing · pdf file26.11.2016 ·...

14
Working Effectively with Legacy Code Robert Haken software architect, HAVIT, s.r.o. [email protected], @RobertHaken Microsoft MVP: Development, MCT, MCSD

Upload: doduong

Post on 06-Feb-2018

234 views

Category:

Documents


6 download

TRANSCRIPT

Page 1: ASP.NET Core Dependency Injection & Unit Testing · PDF file26.11.2016 · WorkingEffectivelywith LegacyCode Robert Haken software architect, HAVIT, s.r.o. haken@havit.cz, @RobertHaken

Working Effectively withLegacy Code

Robert Hakensoftware architect, HAVIT, [email protected], @RobertHakenMicrosoft MVP: Development, MCT, MCSD

Page 2: ASP.NET Core Dependency Injection & Unit Testing · PDF file26.11.2016 · WorkingEffectivelywith LegacyCode Robert Haken software architect, HAVIT, s.r.o. haken@havit.cz, @RobertHaken

bit.ly/havit-job

Page 3: ASP.NET Core Dependency Injection & Unit Testing · PDF file26.11.2016 · WorkingEffectivelywith LegacyCode Robert Haken software architect, HAVIT, s.r.o. haken@havit.cz, @RobertHaken

OCHUTNÁVKA

Legacy Code

Page 4: ASP.NET Core Dependency Injection & Unit Testing · PDF file26.11.2016 · WorkingEffectivelywith LegacyCode Robert Haken software architect, HAVIT, s.r.o. haken@havit.cz, @RobertHaken

LegacyCode?

„Codewithouttests.“ [Michael Feathers]

„Sourcecode inherited from someone else.“

„Sourcecode inherited from an older version of the software.“

„Veškerý kód, s kterým aktuálně nejste spokojeni (nebo byste alespoň neměli být).“ [Robert Haken]

Page 5: ASP.NET Core Dependency Injection & Unit Testing · PDF file26.11.2016 · WorkingEffectivelywith LegacyCode Robert Haken software architect, HAVIT, s.r.o. haken@havit.cz, @RobertHaken

LegacyCode

Non-uniformcodingstyle

Nesrozumitelný

Málo/bez testů

BadDesign

CodeSmell

Page 6: ASP.NET Core Dependency Injection & Unit Testing · PDF file26.11.2016 · WorkingEffectivelywith LegacyCode Robert Haken software architect, HAVIT, s.r.o. haken@havit.cz, @RobertHaken

RefactoringMindset

Plannedrefactoring

„Do not touchworkingcode, unlessneeded.“

Refactoringas yougo.

„Leavethecodein bettercondition thanyoufoundit.“ [TheBoy Scout Rule]

Page 7: ASP.NET Core Dependency Injection & Unit Testing · PDF file26.11.2016 · WorkingEffectivelywith LegacyCode Robert Haken software architect, HAVIT, s.r.o. haken@havit.cz, @RobertHaken

Předpoklady

Sdílené vlastnictví kódu

Komunikace v týmu

Source CodeManagement

Continuous Integration builds + runsTests

Page 8: ASP.NET Core Dependency Injection & Unit Testing · PDF file26.11.2016 · WorkingEffectivelywith LegacyCode Robert Haken software architect, HAVIT, s.r.o. haken@havit.cz, @RobertHaken

RefactoringJustification

Quality

CleanCode

Professionalism

RightThing

Economics

Page 9: ASP.NET Core Dependency Injection & Unit Testing · PDF file26.11.2016 · WorkingEffectivelywith LegacyCode Robert Haken software architect, HAVIT, s.r.o. haken@havit.cz, @RobertHaken

DEMO

Roslyn CodeAnalysis + baseline

Page 10: ASP.NET Core Dependency Injection & Unit Testing · PDF file26.11.2016 · WorkingEffectivelywith LegacyCode Robert Haken software architect, HAVIT, s.r.o. haken@havit.cz, @RobertHaken

CodeAnalyzers

Microsoft.AnalyzerPowerPack (RoslynTeam)

System.Runtime.[CSharp.]Analyzers

StyleCopAnalyzers

SonarLint [SonarQube]

VS Perf-tip:

Tools / Options / Text Editor / C# / Advanced / Enable solution wide analysis = OFF

Page 11: ASP.NET Core Dependency Injection & Unit Testing · PDF file26.11.2016 · WorkingEffectivelywith LegacyCode Robert Haken software architect, HAVIT, s.r.o. haken@havit.cz, @RobertHaken

Refactoring

Continuous, As yougoSmallstepsIDE/ToolingsupportedsafestepsComprehensionRefactoring(Rename, Extract, …)Podpořeno testy

– Pomáhají porozumět kódu– GuardConditions, Contract.Requires– Debug.Assert, InvalidOperationException, …– Unit-Tests– IntegrationTests

Page 12: ASP.NET Core Dependency Injection & Unit Testing · PDF file26.11.2016 · WorkingEffectivelywith LegacyCode Robert Haken software architect, HAVIT, s.r.o. haken@havit.cz, @RobertHaken

"Good" Unit Test

• automated+ repeatable

• fully isolated

• consistent in itsresults

• runsquickly

• full control of the unit under test(alldependencies)

• relevanttomorrow

• easyto implement

• able to run it at the push of a button

• iffails=> easy to detect what was expected

Page 13: ASP.NET Core Dependency Injection & Unit Testing · PDF file26.11.2016 · WorkingEffectivelywith LegacyCode Robert Haken software architect, HAVIT, s.r.o. haken@havit.cz, @RobertHaken

Tips& Tricks

[assembly::InternalsVisibleTo(MyTestAssembly)]

[Obsolete]

TreatWarningsas Errors

Ambient Context(ale ne ServiceLocatornebo public container!)

ServiceFactories

Analyze/ AnalyzeSolutionfor CodeClones

Test / AnalyzeCodeCoverage

Page 14: ASP.NET Core Dependency Injection & Unit Testing · PDF file26.11.2016 · WorkingEffectivelywith LegacyCode Robert Haken software architect, HAVIT, s.r.o. haken@havit.cz, @RobertHaken

Q & A

bit.ly/havit-job