qcon london 2016qcon london 2016 an introduction to property based testing aaron bedra chief...

90
QCon London 2016 An Introduction to Property Based Testing Aaron Bedra Chief Security Officer, Eligible @abedra

Upload: others

Post on 25-May-2020

6 views

Category:

Documents


0 download

TRANSCRIPT

Page 1: QCon London 2016QCon London 2016 An Introduction to Property Based Testing Aaron Bedra Chief Security Officer, Eligible ... There are tons of property based testing libraries available

QCon London 2016An Introduction to Property Based Testing

Aaron Bedra Chief Security Officer, Eligible @abedra

Page 2: QCon London 2016QCon London 2016 An Introduction to Property Based Testing Aaron Bedra Chief Security Officer, Eligible ... There are tons of property based testing libraries available

Why do we test?

• To better understand what we are building

• To help us think deeper about what we are building

• To ensure the correctness of what we are building

• To help us explore our design*

• To explain to others how our code should work

Page 3: QCon London 2016QCon London 2016 An Introduction to Property Based Testing Aaron Bedra Chief Security Officer, Eligible ... There are tons of property based testing libraries available

How do we test?

• With compilers (type systems, static analysis, etc)

• Manual testing

• X-Unit style tests

• Property/generative based tests

• Formal modeling

Page 4: QCon London 2016QCon London 2016 An Introduction to Property Based Testing Aaron Bedra Chief Security Officer, Eligible ... There are tons of property based testing libraries available

How do we test?

• With compilers (type systems, static analysis, etc)

• Manual testing

• X-Unit style tests

• Property/generative based tests

• Formal modeling

Page 5: QCon London 2016QCon London 2016 An Introduction to Property Based Testing Aaron Bedra Chief Security Officer, Eligible ... There are tons of property based testing libraries available

What is it?

Page 6: QCon London 2016QCon London 2016 An Introduction to Property Based Testing Aaron Bedra Chief Security Officer, Eligible ... There are tons of property based testing libraries available

An abstraction

Page 7: QCon London 2016QCon London 2016 An Introduction to Property Based Testing Aaron Bedra Chief Security Officer, Eligible ... There are tons of property based testing libraries available

Property based testing eliminates the guess work on value and order of operations testing

Page 8: QCon London 2016QCon London 2016 An Introduction to Property Based Testing Aaron Bedra Chief Security Officer, Eligible ... There are tons of property based testing libraries available

Magic numbers

Page 9: QCon London 2016QCon London 2016 An Introduction to Property Based Testing Aaron Bedra Chief Security Officer, Eligible ... There are tons of property based testing libraries available

Instead of specifying how you specify what

Page 10: QCon London 2016QCon London 2016 An Introduction to Property Based Testing Aaron Bedra Chief Security Officer, Eligible ... There are tons of property based testing libraries available

Testing over time

Page 11: QCon London 2016QCon London 2016 An Introduction to Property Based Testing Aaron Bedra Chief Security Officer, Eligible ... There are tons of property based testing libraries available

When we start our test suite, things are usually

easy to understand

Page 12: QCon London 2016QCon London 2016 An Introduction to Property Based Testing Aaron Bedra Chief Security Officer, Eligible ... There are tons of property based testing libraries available

public class Basic { public static Integer calculate(Integer x, Integer y) { return x + y; } }

Page 13: QCon London 2016QCon London 2016 An Introduction to Property Based Testing Aaron Bedra Chief Security Officer, Eligible ... There are tons of property based testing libraries available

public class BasicTest { @Test public void TestCalculate() { assertEquals(Integer.valueOf(5), Basic.calculate(3, 2)); } }

Page 14: QCon London 2016QCon London 2016 An Introduction to Property Based Testing Aaron Bedra Chief Security Officer, Eligible ... There are tons of property based testing libraries available

What other tests might we write for this code?

Page 15: QCon London 2016QCon London 2016 An Introduction to Property Based Testing Aaron Bedra Chief Security Officer, Eligible ... There are tons of property based testing libraries available

Like all programs we start simple

Page 16: QCon London 2016QCon London 2016 An Introduction to Property Based Testing Aaron Bedra Chief Security Officer, Eligible ... There are tons of property based testing libraries available

But over time things get more complicated

Page 17: QCon London 2016QCon London 2016 An Introduction to Property Based Testing Aaron Bedra Chief Security Officer, Eligible ... There are tons of property based testing libraries available

What happens when our simple calculate function grows to include an entire domain?

Page 18: QCon London 2016QCon London 2016 An Introduction to Property Based Testing Aaron Bedra Chief Security Officer, Eligible ... There are tons of property based testing libraries available

Our test suite will undoubtedly grow, but we have options to

control the growth

Page 19: QCon London 2016QCon London 2016 An Introduction to Property Based Testing Aaron Bedra Chief Security Officer, Eligible ... There are tons of property based testing libraries available

And also maintain confidence in our tests

Page 20: QCon London 2016QCon London 2016 An Introduction to Property Based Testing Aaron Bedra Chief Security Officer, Eligible ... There are tons of property based testing libraries available
Page 21: QCon London 2016QCon London 2016 An Introduction to Property Based Testing Aaron Bedra Chief Security Officer, Eligible ... There are tons of property based testing libraries available

By changing our mental model just a bit we can

cover much more ground

Page 22: QCon London 2016QCon London 2016 An Introduction to Property Based Testing Aaron Bedra Chief Security Officer, Eligible ... There are tons of property based testing libraries available

Let’s revisit our basic example

Page 23: QCon London 2016QCon London 2016 An Introduction to Property Based Testing Aaron Bedra Chief Security Officer, Eligible ... There are tons of property based testing libraries available

public class Basic { public static Integer calculate(Integer x, Integer y) { return x + y; } }

Page 24: QCon London 2016QCon London 2016 An Introduction to Property Based Testing Aaron Bedra Chief Security Officer, Eligible ... There are tons of property based testing libraries available

But instead of a unit test, let’s write a property

Page 25: QCon London 2016QCon London 2016 An Introduction to Property Based Testing Aaron Bedra Chief Security Officer, Eligible ... There are tons of property based testing libraries available

@RunWith(JUnitQuickcheck.class) public class BasicProperties { @Property public void calculateBaseAssumption(Integer x, Integer y) { Integer expected = x + y; assertEquals(expected, Basic.calculate(x, y)); } }

public class BasicTest { @Test public void TestCalculate() { assertEquals(Integer.valueOf(5), Basic.calculate(3, 2)); } }

Page 26: QCon London 2016QCon London 2016 An Introduction to Property Based Testing Aaron Bedra Chief Security Officer, Eligible ... There are tons of property based testing libraries available

@RunWith(JUnitQuickcheck.class) public class BasicProperties { @Property(trials = 1000000) public void calculateBaseAssumption(Integer x, Integer y) { Integer expected = x + y; assertEquals(expected, Basic.calculate(x, y)); } }

Page 27: QCon London 2016QCon London 2016 An Introduction to Property Based Testing Aaron Bedra Chief Security Officer, Eligible ... There are tons of property based testing libraries available

This property isn’t much different than the unit test

we had before it

Page 28: QCon London 2016QCon London 2016 An Introduction to Property Based Testing Aaron Bedra Chief Security Officer, Eligible ... There are tons of property based testing libraries available

It’s just one level of abstraction higher

Page 29: QCon London 2016QCon London 2016 An Introduction to Property Based Testing Aaron Bedra Chief Security Officer, Eligible ... There are tons of property based testing libraries available

Let’s add a constraint to our calculator

Page 30: QCon London 2016QCon London 2016 An Introduction to Property Based Testing Aaron Bedra Chief Security Officer, Eligible ... There are tons of property based testing libraries available

Let’s say that the output cannot be negative

Page 31: QCon London 2016QCon London 2016 An Introduction to Property Based Testing Aaron Bedra Chief Security Officer, Eligible ... There are tons of property based testing libraries available

public class Basic { public static Integer calculate(Integer x, Integer y) { Integer total = x + y; if (total < 0) { return 0; } else { return total; } } }

java.lang.AssertionError: Property calculateBaseAssumption falsified for args shrunken to [0, -679447654]

Page 32: QCon London 2016QCon London 2016 An Introduction to Property Based Testing Aaron Bedra Chief Security Officer, Eligible ... There are tons of property based testing libraries available

Shrinking

Page 33: QCon London 2016QCon London 2016 An Introduction to Property Based Testing Aaron Bedra Chief Security Officer, Eligible ... There are tons of property based testing libraries available

@RunWith(JUnitQuickcheck.class) public class BasicProperties { @Property public void calculateBaseAssumption(Integer x, Integer y) { Integer expected = x + y; assertEquals(expected, Basic.calculate(x, y)); } }

public class Basic { public static Integer calculate(Integer x, Integer y) { Integer total = x + y; if (total < 0) { return 0; } else { return total; } } }

Page 34: QCon London 2016QCon London 2016 An Introduction to Property Based Testing Aaron Bedra Chief Security Officer, Eligible ... There are tons of property based testing libraries available

Now we can be more specific with our property

Page 35: QCon London 2016QCon London 2016 An Introduction to Property Based Testing Aaron Bedra Chief Security Officer, Eligible ... There are tons of property based testing libraries available

@RunWith(JUnitQuickcheck.class) public class BasicProperties { @Property public void calculateBaseAssumption(Integer x, Integer y) { assumeThat(x, greaterThan(0)); assumeThat(y, greaterThan(0)); assertThat(Basic.calculate(x, y), is(greaterThan(0))); } }

java.lang.AssertionError: Property calculateBaseAssumption falsified for args shrunken to [647853159, 1499681379]

Page 36: QCon London 2016QCon London 2016 An Introduction to Property Based Testing Aaron Bedra Chief Security Officer, Eligible ... There are tons of property based testing libraries available

We could keep going from here but let’s dive into some of the concepts

Page 37: QCon London 2016QCon London 2016 An Introduction to Property Based Testing Aaron Bedra Chief Security Officer, Eligible ... There are tons of property based testing libraries available

Refactoring

Page 38: QCon London 2016QCon London 2016 An Introduction to Property Based Testing Aaron Bedra Chief Security Officer, Eligible ... There are tons of property based testing libraries available

This is one of my favorite use cases for invoking property based testing

Page 39: QCon London 2016QCon London 2016 An Introduction to Property Based Testing Aaron Bedra Chief Security Officer, Eligible ... There are tons of property based testing libraries available

Legacy code becomes the model

Page 40: QCon London 2016QCon London 2016 An Introduction to Property Based Testing Aaron Bedra Chief Security Officer, Eligible ... There are tons of property based testing libraries available

It’s incredibly powerful

Page 41: QCon London 2016QCon London 2016 An Introduction to Property Based Testing Aaron Bedra Chief Security Officer, Eligible ... There are tons of property based testing libraries available

It ensures you have exact feature parity

Page 42: QCon London 2016QCon London 2016 An Introduction to Property Based Testing Aaron Bedra Chief Security Officer, Eligible ... There are tons of property based testing libraries available

Even for unintended features!

Page 43: QCon London 2016QCon London 2016 An Introduction to Property Based Testing Aaron Bedra Chief Security Officer, Eligible ... There are tons of property based testing libraries available

Generators

Page 44: QCon London 2016QCon London 2016 An Introduction to Property Based Testing Aaron Bedra Chief Security Officer, Eligible ... There are tons of property based testing libraries available

You can use them for all kinds of things

Page 45: QCon London 2016QCon London 2016 An Introduction to Property Based Testing Aaron Bedra Chief Security Officer, Eligible ... There are tons of property based testing libraries available

Scenario

Page 46: QCon London 2016QCon London 2016 An Introduction to Property Based Testing Aaron Bedra Chief Security Officer, Eligible ... There are tons of property based testing libraries available

Every route in your web application

Page 47: QCon London 2016QCon London 2016 An Introduction to Property Based Testing Aaron Bedra Chief Security Officer, Eligible ... There are tons of property based testing libraries available

You could define generators based on your

routes

Page 48: QCon London 2016QCon London 2016 An Introduction to Property Based Testing Aaron Bedra Chief Security Officer, Eligible ... There are tons of property based testing libraries available

And create valid and invalid inputs for every

endpoint

Page 49: QCon London 2016QCon London 2016 An Introduction to Property Based Testing Aaron Bedra Chief Security Officer, Eligible ... There are tons of property based testing libraries available

You could run the generators on every test

Page 50: QCon London 2016QCon London 2016 An Introduction to Property Based Testing Aaron Bedra Chief Security Officer, Eligible ... There are tons of property based testing libraries available

Or save the output of the generation for faster

execution

Page 51: QCon London 2016QCon London 2016 An Introduction to Property Based Testing Aaron Bedra Chief Security Officer, Eligible ... There are tons of property based testing libraries available

Saved execution of generators can even bring you to simulation testing

Page 52: QCon London 2016QCon London 2016 An Introduction to Property Based Testing Aaron Bedra Chief Security Officer, Eligible ... There are tons of property based testing libraries available

There are tons of property based testing libraries

available

Page 53: QCon London 2016QCon London 2016 An Introduction to Property Based Testing Aaron Bedra Chief Security Officer, Eligible ... There are tons of property based testing libraries available

But this is a talk in a functional language track

Page 54: QCon London 2016QCon London 2016 An Introduction to Property Based Testing Aaron Bedra Chief Security Officer, Eligible ... There are tons of property based testing libraries available

So let’s have some fun

Page 55: QCon London 2016QCon London 2016 An Introduction to Property Based Testing Aaron Bedra Chief Security Officer, Eligible ... There are tons of property based testing libraries available

Let’s pretend we have some legacy code

Page 56: QCon London 2016QCon London 2016 An Introduction to Property Based Testing Aaron Bedra Chief Security Officer, Eligible ... There are tons of property based testing libraries available

Written in C

Page 57: QCon London 2016QCon London 2016 An Introduction to Property Based Testing Aaron Bedra Chief Security Officer, Eligible ... There are tons of property based testing libraries available

And we want to test it to make sure it actually

works

Page 58: QCon London 2016QCon London 2016 An Introduction to Property Based Testing Aaron Bedra Chief Security Officer, Eligible ... There are tons of property based testing libraries available

But there are no quickcheck libraries

available*

Page 59: QCon London 2016QCon London 2016 An Introduction to Property Based Testing Aaron Bedra Chief Security Officer, Eligible ... There are tons of property based testing libraries available

Warning! The crypto you are about to see should not be

attempted at work

Page 60: QCon London 2016QCon London 2016 An Introduction to Property Based Testing Aaron Bedra Chief Security Officer, Eligible ... There are tons of property based testing libraries available

Caesar’s Cipher

Page 61: QCon London 2016QCon London 2016 An Introduction to Property Based Testing Aaron Bedra Chief Security Officer, Eligible ... There are tons of property based testing libraries available

Let’s start with our implementation

Page 62: QCon London 2016QCon London 2016 An Introduction to Property Based Testing Aaron Bedra Chief Security Officer, Eligible ... There are tons of property based testing libraries available

#include <stdlib.h> #include <string.h> #include <ctype.h>

char *caesar(int shift, char *input) { char *output = malloc(strlen(input)); memset(output, '\0', strlen(input));

for (int x = 0; x < strlen(input); x++) { if (isalpha(input[x])) { int c = toupper(input[x]); c = (((c - 65) + shift) % 26) + 65; output[x] = c; } else { output[x] = input[x]; } }

return output; }

Page 63: QCon London 2016QCon London 2016 An Introduction to Property Based Testing Aaron Bedra Chief Security Officer, Eligible ... There are tons of property based testing libraries available

Next we create a new implementation to test

against

Page 64: QCon London 2016QCon London 2016 An Introduction to Property Based Testing Aaron Bedra Chief Security Officer, Eligible ... There are tons of property based testing libraries available

caesar :: Int -> String -> String caesar k = map f where f c | inRange ('A', 'Z') c = chr $ ord 'A' + (ord c - ord 'A' + k) `mod` 26 | otherwise = c

Page 65: QCon London 2016QCon London 2016 An Introduction to Property Based Testing Aaron Bedra Chief Security Officer, Eligible ... There are tons of property based testing libraries available

We now have two functions that “should” do

the same thing

Page 66: QCon London 2016QCon London 2016 An Introduction to Property Based Testing Aaron Bedra Chief Security Officer, Eligible ... There are tons of property based testing libraries available

But they aren’t in the same language

Page 67: QCon London 2016QCon London 2016 An Introduction to Property Based Testing Aaron Bedra Chief Security Officer, Eligible ... There are tons of property based testing libraries available

Thankfully Haskell has good FFI support

Page 68: QCon London 2016QCon London 2016 An Introduction to Property Based Testing Aaron Bedra Chief Security Officer, Eligible ... There are tons of property based testing libraries available

foreign import ccall "caesar.h caesar" c_caesar :: CInt -> CString -> CString

native_caesar :: Int -> String -> IO String native_caesar shift input = withCString input $ \c_str -> peekCString(c_caesar (fromIntegral shift) c_str)

Page 69: QCon London 2016QCon London 2016 An Introduction to Property Based Testing Aaron Bedra Chief Security Officer, Eligible ... There are tons of property based testing libraries available

$ stack exec ghci caesar.hs caesar.so GHCi, version 7.10.3: http://www.haskell.org/ghc/ :? for help [1 of 1] Compiling Main ( caesar.hs, interpreted ) Ok, modules loaded: Main. *Main> caesar 2 "ATTACKATDAWN" "CVVCEMCVFCYP" *Main> native_caesar 2 "ATTACKATDAWN" "CVVCEMCVFCYP"

Page 70: QCon London 2016QCon London 2016 An Introduction to Property Based Testing Aaron Bedra Chief Security Officer, Eligible ... There are tons of property based testing libraries available

We can now execute our C code from inside of

Haskell

Page 71: QCon London 2016QCon London 2016 An Introduction to Property Based Testing Aaron Bedra Chief Security Officer, Eligible ... There are tons of property based testing libraries available

We can use Haskell’s quickcheck library to

verify our C code

Page 72: QCon London 2016QCon London 2016 An Introduction to Property Based Testing Aaron Bedra Chief Security Officer, Eligible ... There are tons of property based testing libraries available

First we need to write a property

Page 73: QCon London 2016QCon London 2016 An Introduction to Property Based Testing Aaron Bedra Chief Security Officer, Eligible ... There are tons of property based testing libraries available

unsafeEq :: IO String -> String -> Bool unsafeEq x y = unsafePerformIO(x) == y

genSafeChar :: Gen Char genSafeChar = elements ['A' .. 'Z']

genSafeString :: Gen String genSafeString = listOf genSafeChar

newtype SafeString = SafeString { unwrapSafeString :: String } deriving Show instance Arbitrary SafeString where arbitrary = SafeString <$> genSafeString

equivalenceProperty = forAll genSafeString $ \str -> unsafeEq (native_caesar 2 str) (caesar 2 str)

Page 74: QCon London 2016QCon London 2016 An Introduction to Property Based Testing Aaron Bedra Chief Security Officer, Eligible ... There are tons of property based testing libraries available

unsafeEq :: IO String -> String -> Bool unsafeEq x y = unsafePerformIO(x) == y

genSafeChar :: Gen Char genSafeChar = elements ['A' .. 'Z']

genSafeString :: Gen String genSafeString = listOf genSafeChar

newtype SafeString = SafeString { unwrapSafeString :: String } deriving Show instance Arbitrary SafeString where arbitrary = SafeString <$> genSafeString

equivalenceProperty = forAll genSafeString $ \str -> unsafeEq (native_caesar 2 str) (caesar 2 str)

Page 75: QCon London 2016QCon London 2016 An Introduction to Property Based Testing Aaron Bedra Chief Security Officer, Eligible ... There are tons of property based testing libraries available

unsafeEq :: IO String -> String -> Bool unsafeEq x y = unsafePerformIO(x) == y

genSafeChar :: Gen Char genSafeChar = elements ['A' .. 'Z']

genSafeString :: Gen String genSafeString = listOf genSafeChar

newtype SafeString = SafeString { unwrapSafeString :: String } deriving Show instance Arbitrary SafeString where arbitrary = SafeString <$> genSafeString

equivalenceProperty = forAll genSafeString $ \str -> unsafeEq (native_caesar 2 str) (caesar 2 str)

Page 76: QCon London 2016QCon London 2016 An Introduction to Property Based Testing Aaron Bedra Chief Security Officer, Eligible ... There are tons of property based testing libraries available

unsafeEq :: IO String -> String -> Bool unsafeEq x y = unsafePerformIO(x) == y

genSafeChar :: Gen Char genSafeChar = elements ['A' .. 'Z']

genSafeString :: Gen String genSafeString = listOf genSafeChar

newtype SafeString = SafeString { unwrapSafeString :: String } deriving Show instance Arbitrary SafeString where arbitrary = SafeString <$> genSafeString

equivalenceProperty = forAll genSafeString $ \str -> unsafeEq (native_caesar 2 str) (caesar 2 str)

Page 77: QCon London 2016QCon London 2016 An Introduction to Property Based Testing Aaron Bedra Chief Security Officer, Eligible ... There are tons of property based testing libraries available

unsafeEq :: IO String -> String -> Bool unsafeEq x y = unsafePerformIO(x) == y

genSafeChar :: Gen Char genSafeChar = elements ['A' .. 'Z']

genSafeString :: Gen String genSafeString = listOf genSafeChar

newtype SafeString = SafeString { unwrapSafeString :: String } deriving Show instance Arbitrary SafeString where arbitrary = SafeString <$> genSafeString

equivalenceProperty = forAll genSafeString $ \str -> unsafeEq (native_caesar 2 str) (caesar 2 str)

Page 78: QCon London 2016QCon London 2016 An Introduction to Property Based Testing Aaron Bedra Chief Security Officer, Eligible ... There are tons of property based testing libraries available

unsafeEq :: IO String -> String -> Bool unsafeEq x y = unsafePerformIO(x) == y

genSafeChar :: Gen Char genSafeChar = elements ['A' .. 'Z']

genSafeString :: Gen String genSafeString = listOf genSafeChar

newtype SafeString = SafeString { unwrapSafeString :: String } deriving Show instance Arbitrary SafeString where arbitrary = SafeString <$> genSafeString

equivalenceProperty = forAll genSafeString $ \str -> unsafeEq (native_caesar 2 str) (caesar 2 str)

Page 79: QCon London 2016QCon London 2016 An Introduction to Property Based Testing Aaron Bedra Chief Security Officer, Eligible ... There are tons of property based testing libraries available

*Main> quickCheck equivalenceProperty *** Failed! Falsifiable (after 20 tests): "QYMSMCWTIXNDFDMLSL" *Main> caesar 2 "QYMSMCWTIXNDFDMLSL" "SAOUOEYVKZPFHFONUN" *Main> native_caesar 2 "QYMSMCWTIXNDFDMLSL" “SAOUOEYVKZPFHFONUN/Users/abedra/x“

Page 80: QCon London 2016QCon London 2016 An Introduction to Property Based Testing Aaron Bedra Chief Security Officer, Eligible ... There are tons of property based testing libraries available

#include <stdlib.h> #include <string.h> #include <ctype.h>

char *caesar(int shift, char *input) { char *output = malloc(strlen(input)); memset(output, '\0', strlen(input));

for (int x = 0; x < strlen(input); x++) { if (isalpha(input[x])) { int c = toupper(input[x]); c = (((c - 65) + shift) % 26) + 65; output[x] = c; } else { output[x] = input[x]; } }

return output; }

Page 81: QCon London 2016QCon London 2016 An Introduction to Property Based Testing Aaron Bedra Chief Security Officer, Eligible ... There are tons of property based testing libraries available

We’ve found a memory handling issue in our C

code!

Page 82: QCon London 2016QCon London 2016 An Introduction to Property Based Testing Aaron Bedra Chief Security Officer, Eligible ... There are tons of property based testing libraries available

In reality there are more issues with this code, but our issue was quickly exposed

Page 83: QCon London 2016QCon London 2016 An Introduction to Property Based Testing Aaron Bedra Chief Security Officer, Eligible ... There are tons of property based testing libraries available

And easily reproduced

Page 84: QCon London 2016QCon London 2016 An Introduction to Property Based Testing Aaron Bedra Chief Security Officer, Eligible ... There are tons of property based testing libraries available

Wrapping up

Page 85: QCon London 2016QCon London 2016 An Introduction to Property Based Testing Aaron Bedra Chief Security Officer, Eligible ... There are tons of property based testing libraries available

Not all testing is created equal

Page 86: QCon London 2016QCon London 2016 An Introduction to Property Based Testing Aaron Bedra Chief Security Officer, Eligible ... There are tons of property based testing libraries available

You should use as many different testing

techniques as you need

Page 87: QCon London 2016QCon London 2016 An Introduction to Property Based Testing Aaron Bedra Chief Security Officer, Eligible ... There are tons of property based testing libraries available

Remember to think about the limits of your tools

Page 88: QCon London 2016QCon London 2016 An Introduction to Property Based Testing Aaron Bedra Chief Security Officer, Eligible ... There are tons of property based testing libraries available

And use tools that help you achieve your results

more effectively

Page 89: QCon London 2016QCon London 2016 An Introduction to Property Based Testing Aaron Bedra Chief Security Officer, Eligible ... There are tons of property based testing libraries available

And more efficiently

Page 90: QCon London 2016QCon London 2016 An Introduction to Property Based Testing Aaron Bedra Chief Security Officer, Eligible ... There are tons of property based testing libraries available

Questions?