Testing, part 1 UNC COMP 523 October 19, 2020 Jeff Terrell 1 / 36 - - PowerPoint PPT Presentation

testing part 1
SMART_READER_LITE
LIVE PREVIEW

Testing, part 1 UNC COMP 523 October 19, 2020 Jeff Terrell 1 / 36 - - PowerPoint PPT Presentation

Testing, part 1 UNC COMP 523 October 19, 2020 Jeff Terrell 1 / 36 Announcements sign up for OpenClass.ai before Q5 this Wednesday (will include content from Wednesday) remember that mentor meetings need demos now grades are up to date as of


slide-1
SLIDE 1

Testing, part 1

UNC COMP 523 October 19, 2020 Jeff Terrell

1 / 36

slide-2
SLIDE 2

Announcements

sign up for OpenClass.ai before Q5 this Wednesday (will include content from Wednesday) remember that mentor meetings need demos now grades are up to date as of 12pm today tech talk schedule and topics are finalized and posted; 6 teams go next week what counts as active learning in your tech talk?

Testing, part 1

2 / 36

slide-3
SLIDE 3

After this semester

client needs some bug fixed or feature added you graduated and moved to <location> to work for <awesome company> client's niece has a friend who knows how to code how will the friend learn the codebase and feel confident about their change?

Testing, part 1

3 / 36

slide-4
SLIDE 4

After this semester (2)

you graduate and moved to <location> to work for <awesome company> your first assignment is to add <feature> to the flagship app of <awesome company> how will you learn the codebase and feel confident that you aren't breaking something?

Testing, part 1

4 / 36

slide-5
SLIDE 5

The point: an app with automated tests covering all of the important features is easier to contribute to.

5 / 36

slide-6
SLIDE 6

After this semester (3)

you graduate and moved to <location> to work for <awesome company> your first assignment is to add <feature> to the flagship app of <awesome company> you get a dev environment setup to see the effect of your changes you add some code for your feature you can run the comprehensive test suite to be sure you haven't broken anything else in fact, your code can't be deployed unless all the tests pass (and, ideally, your commit(s) won't be merged unless they're covered with tests you wrote, to pay it forward)

Testing, part 1

6 / 36

slide-7
SLIDE 7

Before automated tests [were mainstream]

without automated tests, we might break things more often some shops have a manual testing script manual testing is not fun, error prone, and tends to make releases infrequent (remember system agility?) I had a freelance gig once... some shops have a QA (quality assurance) team; see above

Testing, part 1

7 / 36

slide-8
SLIDE 8

Aside: alternatives to testing

static type systems can catch errors before deployment some type systems are very sophisticated (e.g. Haskell's) and catch many things (for more on this, I'll be teaching 524 programming languages next semester...) even there, many complex projects still have tests neither types nor tests give waterproof guarantees of working software

Testing, part 1

8 / 36

slide-9
SLIDE 9

Outline

Introduction Why test? Why not test? Types of tests Test coverage Test-driven development (TDD)

Testing, part 1

9 / 36

slide-10
SLIDE 10

Outline

Introduction Why test? Why not test? Types of tests Test coverage Test-driven development (TDD)

Testing, part 1

10 / 36

slide-11
SLIDE 11

Why test? (1)

  • 1. Tests give confidence

see earlier stories: without tests, it's hard to know if you broke something also, with tests, you have more confidence that your own feature works right recall XP value of courage; tests enable courage confidence is huge! This is the most important reason to write tests!

Testing, part 1

11 / 36

slide-12
SLIDE 12

Why test? (2)

  • 2. You get the perspective of the caller

this helps keep things taut and minimal remember YAGNI - You Ain’t Gonna Need It

Testing, part 1

12 / 36

slide-13
SLIDE 13

Why test? (3)

  • 3. Tests document developer intentions

e.g. “I need to be sure this function works on these kinds of inputs”

  • r, “How do I intend this function to be called/this object to be used?”

Testing, part 1

13 / 36

slide-14
SLIDE 14

Why test? (4)

  • 4. Tests reveal regressions

did you break an existing feature? if it was tested, you’ll know right away a test suite is a gift to future developers on the project, including yourself

Testing, part 1

14 / 36

slide-15
SLIDE 15

Why test? (5)

  • 5. Tests close the time gap

expert programmers use tight feedback loops to iterate quickly this enables a laser focus with a tight feedback loop, why not trigger it often? then if something breaks, it was in code you just wrote if it works, then forget about it and focus on the next tiny thing key idea: rapid tests enable rapid iteration and slow tests help find bugs before users do

Testing, part 1

15 / 36

slide-16
SLIDE 16

Why test? (6)

  • 6. Tests enable refactoring

remember XP practice of refactoring? “red, green, refactor”

  • nce you have passing tests (green), you can clean up

decouples getting it working from getting it simple again, rapid tests give a tight feedback loop when refactoring in other words, decouple getting it /working/ from getting it /right/ advice from Don Smith re: writing: braindump first, clean up later (or Hemingway: write drunk, edit sober)

Testing, part 1

16 / 36

slide-17
SLIDE 17

Why test? (7)

  • 7. Testing can be fun

taking small steps and making steady progress feels good! helps you get into a mental state of creative flow, which is fun! worst experience in programming IMO: feeling stuck with good tests as a feedback loop, it's harder to get stuck

Testing, part 1

17 / 36

slide-18
SLIDE 18

Why test? (summary)

  • 1. Tests give confidence
  • 2. You get the perspective of the caller
  • 3. Tests document developer intentions
  • 4. Tests reveal regressions
  • 5. Tests close the time gap
  • 6. Tests enable refactoring
  • 7. Testing can be fun

Testing, part 1

18 / 36

slide-19
SLIDE 19

Outline

Introduction Why test? Why not test? Types of tests Test coverage Test-driven development (TDD)

Testing, part 1

19 / 36

slide-20
SLIDE 20

Why not test? (1)

  • 1. Tests add complexity to the project

now you have to write not just code, but also tests sometimes you even have more test code than implementation code but, complexity is in a "sidecar" though, in separate directory also, getting perspective of caller and doing refactoring can pay for testing complexity

Testing, part 1

20 / 36

slide-21
SLIDE 21

Why not test? (2)

  • 2. Tests don’t catch every bug

but it does catch many of them and the feedback loop and creative flow tests provide are useful

Testing, part 1

21 / 36

slide-22
SLIDE 22

Why not test? (3)

  • 3. Tests add inertia to the interface

if you need to change the interface, you also have to change the tests this isn’t technically “refactoring” at this point, it’s a heavier change avoid changing the interface if possible but if it sucks, redo it! (remember XP value of simplicity)

Testing, part 1

22 / 36

slide-23
SLIDE 23

Should I test?

My standard recommendation: if you're working on throwaway code or a short-lived experiment or exploration, don't test. Otherwise, test. (And COMP 523 projects should be considered long-lived!)

Testing, part 1

23 / 36

slide-24
SLIDE 24

Outline

Introduction Why test? Why not test? Types of tests Test coverage Test-driven development (TDD)

Testing, part 1

24 / 36

slide-25
SLIDE 25

Types of tests

unit: test one component in isolation integration: test several components working together end-to-end: a scripted robot that operates as a user

Testing, part 1

25 / 36

slide-26
SLIDE 26

Unit tests

goal: test one component in isolation "component": typically a function or a class can use "test doubles" to achieve isolation that doesn't otherwise exist (more about this later) a pure function is dead-simple to test: did these arguments result in this returned value? example: add(8, 7) => 15 OOP example: new CsvData("col1,col2\nval11,val12\n").columns() => ['col1', 'col2']

Testing, part 1

26 / 36

slide-27
SLIDE 27

Integration tests

goal: test several components working together "several" could be 2 or 500; there's a wide range here example: new CsvDataFile('data.csv').columns() => ['col1', 'col2'] example: trying to login to the backend with invalid credentials results in a 403 Forbidden response

Testing, part 1

27 / 36

slide-28
SLIDE 28

End-to-end (E2E) tests

goal: test the entire system as a user typically involves fancy tools to navigate a user interface e.g. Cypress (for Javascript) lets you drive a browser through your app

Testing, part 1

28 / 36

slide-29
SLIDE 29

Tradeoffs

implementation difficulty: unit tests are easiest execution speed: unit tests are fastest (remember fast feedback loops) confidence delivered: e2e tests are very valuable! suggestion: make an informed choice that makes sense for your project suggestion: tackle variation where it lives rare to find a project that only has one type of test (though many lack e2e tests) most components aren't isolated, and test doubles might not be worth it understand these tradeoffs to navigate the religious wars about testing

Testing, part 1

29 / 36

slide-30
SLIDE 30

Outline

Introduction Why test? Why not test? Types of tests Test coverage Test-driven development (TDD)

Testing, part 1

30 / 36

slide-31
SLIDE 31

Test coverage

there's no perfect metric to measure health of a test suite but test coverage is a useful one measures percentage of codebase exercised by test suite 100% means every line of code is covered by a test 100% is usually not a goal: some code is boring and/or tests aren't worth the trouble (a measure of your engineering maturity: evaluating risk/reward in light of context) recall from syllabus that "an app getting a grade of A...has good test coverage (probably over 70%, although that can depend on the project)"

Testing, part 1

31 / 36

slide-32
SLIDE 32

Test coverage challenges

e.g. Team I is using Tableau for their app perhaps some code could be extracted into functions/classes, and unit/integration tests written also, they could use Cypress to drive a browser through the app e.g. Team C is creating a VR app see above about unit/integration tests for functions/classes is there a way to do e2e testing on VR apps? That might be too hard! e.g. Team N is modernizing a data-centric web site their program runs once to create the site; there is no long-lived app unit/integration tests still useful for the components also, e2e testing might be easier: the program's UI is the command line

Testing, part 1

32 / 36

slide-33
SLIDE 33

Outline

Introduction Why test? Why not test? Types of tests Test coverage Test-driven development (TDD)

Testing, part 1

33 / 36

slide-34
SLIDE 34

Test-driven development (TDD)

we saw TDD as one of the XP practices this is still somewhat extreme alternative might be called TLD: test-last development I've done TDD at my last job, but it was hard to get to a place it felt comfortable my difficulty: fluency with testing framework vs. just using dev environment TDD and TLD both provide current and future confidence experienced devs will have good feedback loops with TLD like what TDD can give you

Testing, part 1

34 / 36

slide-35
SLIDE 35

Topics for next time (maybe)

Testing Test doubles Tips for test-friendly code dependency injection effects management and pure functions Tech debt Quiz 5!

Testing, part 1

35 / 36

slide-36
SLIDE 36

TAQs

Go to pollev.com/jeffterrell

36 / 36