Slide 1

Slide 1 text

Strategies For Testing Async Code Neil Chazin

Slide 2

Slide 2 text

Who am I? — Programming in Python since the early 2000s — Believe that testing software is important — @neilathotep neil chazin - @neilathotep

Slide 3

Slide 3 text

Work — Currently Senior Software Engineer/Tech Lead at Agari — Agari secures digital communications to ensure humanity prevails over evil neil chazin - @neilathotep

Slide 4

Slide 4 text

Brief Outline 1. Why? 2. Quick intro to async & asyncio 3. Challenges of testing — Some solutions I've found 4. Wrap up neil chazin - @neilathotep

Slide 5

Slide 5 text

Why? neil chazin - @neilathotep

Slide 6

Slide 6 text

— Testing is important — Performance is often important neil chazin - @neilathotep

Slide 7

Slide 7 text

neil chazin - @neilathotep

Slide 8

Slide 8 text

Async in Python A very brief intro neil chazin - @neilathotep

Slide 9

Slide 9 text

General Async Basics — Concurrency through cooperation — yield control when 'waiting' - asynchronous results neil chazin - @neilathotep

Slide 10

Slide 10 text

asyncio — framework for asynchronous computing — available in stdlib as of 3.4 — Improved syntax in 3.5 — Incremental changes in 3.6 and 3.7 neil chazin - @neilathotep

Slide 11

Slide 11 text

Two primary concepts — Coroutines: perform asynchronous work — Event loops: schedule asynchronous work neil chazin - @neilathotep

Slide 12

Slide 12 text

Key syntax — async - define a coroutine — await - 'call' a coroutine neil chazin - @neilathotep

Slide 13

Slide 13 text

Example use case We need something simple... neil chazin - @neilathotep

Slide 14

Slide 14 text

neil chazin - @neilathotep

Slide 15

Slide 15 text

neil chazin - @neilathotep

Slide 16

Slide 16 text

neil chazin - @neilathotep

Slide 17

Slide 17 text

neil chazin - @neilathotep

Slide 18

Slide 18 text

neil chazin - @neilathotep

Slide 19

Slide 19 text

Challenge Testing a coroutine neil chazin - @neilathotep

Slide 20

Slide 20 text

Call as a function neil chazin - @neilathotep

Slide 21

Slide 21 text

Call as a function neil chazin - @neilathotep

Slide 22

Slide 22 text

Tests pass but... neil chazin - @neilathotep

Slide 23

Slide 23 text

Tests pass but... neil chazin - @neilathotep

Slide 24

Slide 24 text

Await the coroutine neil chazin - @neilathotep

Slide 25

Slide 25 text

SyntaxError neil chazin - @neilathotep

Slide 26

Slide 26 text

Run in an event loop neil chazin - @neilathotep

Slide 27

Slide 27 text

Run in an event loop neil chazin - @neilathotep

Slide 28

Slide 28 text

Success neil chazin - @neilathotep

Slide 29

Slide 29 text

Use pytest-asyncio — pip install pytest-asyncio neil chazin - @neilathotep

Slide 30

Slide 30 text

neil chazin - @neilathotep

Slide 31

Slide 31 text

neil chazin - @neilathotep

Slide 32

Slide 32 text

neil chazin - @neilathotep

Slide 33

Slide 33 text

neil chazin - @neilathotep

Slide 34

Slide 34 text

Python 3.7 New function asyncio.run() simplifies things neil chazin - @neilathotep

Slide 35

Slide 35 text

neil chazin - @neilathotep

Slide 36

Slide 36 text

Challenge Mocks and patching neil chazin - @neilathotep

Slide 37

Slide 37 text

Mocks o!en relied upon — Unittest.mock.Mock won't mock a coroutine neil chazin - @neilathotep

Slide 38

Slide 38 text

neil chazin - @neilathotep

Slide 39

Slide 39 text

neil chazin - @neilathotep

Slide 40

Slide 40 text

neil chazin - @neilathotep

Slide 41

Slide 41 text

neil chazin - @neilathotep

Slide 42

Slide 42 text

neil chazin - @neilathotep

Slide 43

Slide 43 text

Challenge Context managers neil chazin - @neilathotep

Slide 44

Slide 44 text

neil chazin - @neilathotep

Slide 45

Slide 45 text

Challenge More complex use cases neil chazin - @neilathotep

Slide 46

Slide 46 text

— Previous patterns all work great but some short comings I've found: — test coroutines that do not run in the MainThread when executing — test syncronous functions that call into event loops () — functional tests — Event Loop variants (e.g. uvloop) neil chazin - @neilathotep

Slide 47

Slide 47 text

neil chazin - @neilathotep

Slide 48

Slide 48 text

neil chazin - @neilathotep

Slide 49

Slide 49 text

neil chazin - @neilathotep

Slide 50

Slide 50 text

neil chazin - @neilathotep

Slide 51

Slide 51 text

Calling across threads neil chazin - @neilathotep

Slide 52

Slide 52 text

neil chazin - @neilathotep

Slide 53

Slide 53 text

neil chazin - @neilathotep

Slide 54

Slide 54 text

neil chazin - @neilathotep

Slide 55

Slide 55 text

neil chazin - @neilathotep

Slide 56

Slide 56 text

neil chazin - @neilathotep

Slide 57

Slide 57 text

neil chazin - @neilathotep

Slide 58

Slide 58 text

Wrap up — Try out asyncio programming — Keep testing — Find sample code and presentation at: h!ps://bit.ly/nchazin-pycon2019 neil chazin - @neilathotep