Svoboda | Graniru | BBC Russia | Golosameriki | Facebook
SlideShare a Scribd company logo

1

Scaffolding a
legacy app with
BDD scenarios
using SpecFlow/Cucumber
BDD London Meetup, Skills Matter
24/5/2016
Gáspár Nagy
coach • trainer • bdd addict • creator of specflow
@gasparnagy • gaspar@specsolutions.eu
sponsors:

2

Copyright © Gaspar Nagy
bdd addict
given.when.then
CAUTION!
bddaddict.com
on the stage

3

In my brain…
• Support SpecFlow contrib team
• SpecFlow for .NET Core
• Behavior driven UI automation
• BDD Addict Newsletter (bddaddict.com)
• Gherkin parser (now for elixir)
• Integration of Gherkin scenarios to TFS/MTM
• Property-based testing with BDD
• “SpecFlow Tips” blog series on gasparnagy.com
• Promote agile testing & BDD in Hungary
• SpecFlow book
• Challenges of applying BDD to legacy apps

4

Copyright © Gaspar Nagy
What is BDD?

5

Copyright © Gaspar Nagy
BDD =
Product Ownership +
Collaboration +
Automation
on the product
of requirements
real

6

Copyright © Gaspar Nagy
Smart Calculator
Demo: BDD Drives
Development

7

Copyright © Gaspar Nagy
How can I apply this
to legacy apps?

8

Copyright © Gaspar Nagy
Working with a legacy app is like
renovating a house…

9

Renovation can be
challenging…
Source: http://kadarkocka.blogspot.com/2011_08_01_archive.html

10

Copyright © Gaspar Nagy
My Story
The project was delivered in cooperation with TechTalk (www.techtalk.at)

11

It was modern…
Source: http://irodahaz.info

12

Complex domain…

13

106 failing (integration?) tests

14

Copyright © Gaspar Nagy
… and other challenges
• 17 GB test database
• 46 projects
• 300k lines of code
• >2 minutes build time

15

Copyright © Gaspar Nagy
What can I do with this?

16

Copyright © Gaspar Nagy

17

Source: Wikipedia

18

Copyright © Gaspar Nagy
The first change request

19

Deployment –
Workflow

20

Copyright © Gaspar Nagy
0. Get the infrastructure ready
We need a healthy local dev and CI environment!
• Make a dummy test and get it running!
• Ignore/skip/delete unstable
tests
• Setup the desired testing
model (e.g. SpecFlow)
• Test core dependencies
(e.g. “When I do
something with the
database”)

21

Copyright © Gaspar Nagy
1. Capture current behavior
• Based on the way it was demoed to you
• Do not worry about automation
• Do not worry about details
• Do not worry about exact phrasing

22

Copyright © Gaspar Nagy
TDD Cycle

23

Copyright © Gaspar Nagy
ATDD Cycle

24

Copyright © Gaspar Nagy
1. Capture current behavior
Red

25

Copyright © Gaspar Nagy
2. Automate “Then” steps
• Feel free to hard-wire concrete data (IDs)!
Red

26

Copyright © Gaspar Nagy
3. Improve errors
Our scenario fails. Is it easy to understand why?
• Check the test output and improve if necessary!
Red

27

Copyright © Gaspar Nagy

28

Copyright © Gaspar Nagy
4. Automate “When”
with hard-wired data
• We have something to start with!
• (But its obviously nasty with “2347599”)
Green

29

Copyright © Gaspar Nagy

30

Copyright © Gaspar Nagy
We need to get rid of the hard-wired
data!

31

1
2
3
4
5
8
9
#6
7

32

5. Pick off a bite!
1
2
3
4
5
8
9
#6
7
Aut
#
#’

33

Copyright © Gaspar Nagy
5. Pick off a bite
Refactor

34

Copyright © Gaspar Nagy

35

Copyright © Gaspar Nagy
We have scaffolded our application
for implementing this feature!

36

Copyright © Gaspar Nagy
6. Describe the new feature
Red

37

Copyright © Gaspar Nagy
7. Automate and implement
it
• You can even forget that your are maintaining a legacy
app here…
Green

38

Copyright © Gaspar Nagy
8. Discover corner cases
• We have seen a “happy path” so far…
• But what happens if…
• …there are associated deliverables
• …the package is partially frozen
• …

39

Copyright © Gaspar Nagy
9. Pick low hanging fruits
• We have developed an automation interface for a part
of the application
• Can we use it to cover other usual cases?

40

Copyright © Gaspar Nagy

41

Copyright © Gaspar Nagy
Summary: The first change
request
• We addressed the system through a new feature
• Ensured that the test infrastructure works
• Scaffolded the app with a test for the current behavior
using hard wired data
• Refactored the automation to eliminate some parts of
these data – taken apart a bit of the scaffolding
• Described and implemented the new feature
• Used the automation infrastructure for further tests

42

Copyright © Gaspar Nagy
The first bug

43

Copyright © Gaspar Nagy
This is a nasty bug…
• Because
• Workflow is handled by WF 3
• Script is executed on a remote machine through SSH
• A very old dead OSS project is used for SSH (no timeout
setting)
• I cannot even try this out!

44

Copyright © Gaspar Nagy
Ok… calm down.
We have a process…

45

Copyright © Gaspar Nagy
1. Capture current behavior
• Do not worry about automation
• Do not worry about details
• Do not worry about exact phrasing
Red

46

Copyright © Gaspar Nagy
2. How to test SSH?
A focused scenario can drive you to find a solution for
automation
• Find a tool that can be well automated and can be
used for SSH – Vagrant?
• Set it up locally (don’t worry about the automation yet)
• Make the test pass with the local setup
• Do you remember deployment #2347599?
• Refactor: Eliminate hard-wired details
Green

47

Copyright © Gaspar Nagy
3. Describe bug as a
scenario
Red

48

Copyright © Gaspar Nagy
4. Fix the bug!
• With the test we could find the bug that was actually in
the SSH library
Green

49

Copyright © Gaspar Nagy
Shall we keep regression tests?
• It depends…
• If the bug highlighted an important business case –
keep it!
• If it described a special situation (and the bugfix was
covered by unit/integration tests) – delete it!
• Maintaining regression tests is very costly!

50

Copyright © Gaspar Nagy

51

Copyright © Gaspar Nagy
Summary: The first bug
• Similarly to new features, addressing the bugs by
capturing the current behavior as scenarios is helpful
• Don’t be afraid of deleting the regression test after
fixing the bug if it does not represent an important
business case

52

Copyright © Gaspar Nagy
Working on a legacy app does not
mean that you cannot apply BDD
process.
The scenarios can guide you to
discover more and more from the
application!

53

Copyright © Gaspar Nagy
Happy maintenance!

54

Copyright © Gaspar Nagy
bdd addict
given.when.then
CAUTION!
bddaddict.com
on the loose

55

Gáspár Nagy
coach • trainer • bdd addict • creator of specflow
@gasparnagy • gaspar@specsolutions.eu
Thank you!

More Related Content

Scaffolding a legacy app with BDD scenarios using SpecFlow/Cucumber (BDD London Meetup, Skills Matter, 24/5/2016)

  • 1. Scaffolding a legacy app with BDD scenarios using SpecFlow/Cucumber BDD London Meetup, Skills Matter 24/5/2016 Gáspár Nagy coach • trainer • bdd addict • creator of specflow @gasparnagy • [email protected] sponsors:
  • 2. Copyright © Gaspar Nagy bdd addict given.when.then CAUTION! bddaddict.com on the stage
  • 3. In my brain… • Support SpecFlow contrib team • SpecFlow for .NET Core • Behavior driven UI automation • BDD Addict Newsletter (bddaddict.com) • Gherkin parser (now for elixir) • Integration of Gherkin scenarios to TFS/MTM • Property-based testing with BDD • “SpecFlow Tips” blog series on gasparnagy.com • Promote agile testing & BDD in Hungary • SpecFlow book • Challenges of applying BDD to legacy apps
  • 4. Copyright © Gaspar Nagy What is BDD?
  • 5. Copyright © Gaspar Nagy BDD = Product Ownership + Collaboration + Automation on the product of requirements real
  • 6. Copyright © Gaspar Nagy Smart Calculator Demo: BDD Drives Development
  • 7. Copyright © Gaspar Nagy How can I apply this to legacy apps?
  • 8. Copyright © Gaspar Nagy Working with a legacy app is like renovating a house…
  • 9. Renovation can be challenging… Source: http://kadarkocka.blogspot.com/2011_08_01_archive.html
  • 10. Copyright © Gaspar Nagy My Story The project was delivered in cooperation with TechTalk (www.techtalk.at)
  • 11. It was modern… Source: http://irodahaz.info
  • 14. Copyright © Gaspar Nagy … and other challenges • 17 GB test database • 46 projects • 300k lines of code • >2 minutes build time
  • 15. Copyright © Gaspar Nagy What can I do with this?
  • 18. Copyright © Gaspar Nagy The first change request
  • 20. Copyright © Gaspar Nagy 0. Get the infrastructure ready We need a healthy local dev and CI environment! • Make a dummy test and get it running! • Ignore/skip/delete unstable tests • Setup the desired testing model (e.g. SpecFlow) • Test core dependencies (e.g. “When I do something with the database”)
  • 21. Copyright © Gaspar Nagy 1. Capture current behavior • Based on the way it was demoed to you • Do not worry about automation • Do not worry about details • Do not worry about exact phrasing
  • 22. Copyright © Gaspar Nagy TDD Cycle
  • 23. Copyright © Gaspar Nagy ATDD Cycle
  • 24. Copyright © Gaspar Nagy 1. Capture current behavior Red
  • 25. Copyright © Gaspar Nagy 2. Automate “Then” steps • Feel free to hard-wire concrete data (IDs)! Red
  • 26. Copyright © Gaspar Nagy 3. Improve errors Our scenario fails. Is it easy to understand why? • Check the test output and improve if necessary! Red
  • 28. Copyright © Gaspar Nagy 4. Automate “When” with hard-wired data • We have something to start with! • (But its obviously nasty with “2347599”) Green
  • 30. Copyright © Gaspar Nagy We need to get rid of the hard-wired data!
  • 32. 5. Pick off a bite! 1 2 3 4 5 8 9 #6 7 Aut # #’
  • 33. Copyright © Gaspar Nagy 5. Pick off a bite Refactor
  • 35. Copyright © Gaspar Nagy We have scaffolded our application for implementing this feature!
  • 36. Copyright © Gaspar Nagy 6. Describe the new feature Red
  • 37. Copyright © Gaspar Nagy 7. Automate and implement it • You can even forget that your are maintaining a legacy app here… Green
  • 38. Copyright © Gaspar Nagy 8. Discover corner cases • We have seen a “happy path” so far… • But what happens if… • …there are associated deliverables • …the package is partially frozen • …
  • 39. Copyright © Gaspar Nagy 9. Pick low hanging fruits • We have developed an automation interface for a part of the application • Can we use it to cover other usual cases?
  • 41. Copyright © Gaspar Nagy Summary: The first change request • We addressed the system through a new feature • Ensured that the test infrastructure works • Scaffolded the app with a test for the current behavior using hard wired data • Refactored the automation to eliminate some parts of these data – taken apart a bit of the scaffolding • Described and implemented the new feature • Used the automation infrastructure for further tests
  • 42. Copyright © Gaspar Nagy The first bug
  • 43. Copyright © Gaspar Nagy This is a nasty bug… • Because • Workflow is handled by WF 3 • Script is executed on a remote machine through SSH • A very old dead OSS project is used for SSH (no timeout setting) • I cannot even try this out!
  • 44. Copyright © Gaspar Nagy Ok… calm down. We have a process…
  • 45. Copyright © Gaspar Nagy 1. Capture current behavior • Do not worry about automation • Do not worry about details • Do not worry about exact phrasing Red
  • 46. Copyright © Gaspar Nagy 2. How to test SSH? A focused scenario can drive you to find a solution for automation • Find a tool that can be well automated and can be used for SSH – Vagrant? • Set it up locally (don’t worry about the automation yet) • Make the test pass with the local setup • Do you remember deployment #2347599? • Refactor: Eliminate hard-wired details Green
  • 47. Copyright © Gaspar Nagy 3. Describe bug as a scenario Red
  • 48. Copyright © Gaspar Nagy 4. Fix the bug! • With the test we could find the bug that was actually in the SSH library Green
  • 49. Copyright © Gaspar Nagy Shall we keep regression tests? • It depends… • If the bug highlighted an important business case – keep it! • If it described a special situation (and the bugfix was covered by unit/integration tests) – delete it! • Maintaining regression tests is very costly!
  • 51. Copyright © Gaspar Nagy Summary: The first bug • Similarly to new features, addressing the bugs by capturing the current behavior as scenarios is helpful • Don’t be afraid of deleting the regression test after fixing the bug if it does not represent an important business case
  • 52. Copyright © Gaspar Nagy Working on a legacy app does not mean that you cannot apply BDD process. The scenarios can guide you to discover more and more from the application!
  • 53. Copyright © Gaspar Nagy Happy maintenance!
  • 54. Copyright © Gaspar Nagy bdd addict given.when.then CAUTION! bddaddict.com on the loose
  • 55. Gáspár Nagy coach • trainer • bdd addict • creator of specflow @gasparnagy • [email protected] Thank you!