Slide 1

Slide 1 text

PETRI NETS BASED TESTING

Slide 2

Slide 2 text

👋 Alex Rodionov 2

Slide 3

Slide 3 text

3 👋 Alex Rodionov

Slide 4

Slide 4 text

👋 Alex Rodionov @p0deje 4

Slide 5

Slide 5 text

5 👋 Alex Rodionov @p0deje

Slide 6

Slide 6 text

6 👋 Alex Rodionov @p0deje

Slide 7

Slide 7 text

7 👋 Alex Rodionov @p0deje

Slide 8

Slide 8 text

PETRI NETS BASED TESTING

Slide 9

Slide 9 text

1. Insuf fi ciency of usual tests 
 
 


Slide 10

Slide 10 text

1. Insuf fi ciency of usual tests 2. Model-based testing 
 


Slide 11

Slide 11 text

1. Insuf fi ciency of usual tests 2. Model-based testing 3. Petri nets 


Slide 12

Slide 12 text

1. Insuf fi ciency of usual tests 2. Model-based testing 3. Petri nets 4. Petri nets based testing

Slide 13

Slide 13 text

1. Insuf fi ciency of usual tests 2. Model-based testing 3. Petri nets 4. Petri nets based testing

Slide 14

Slide 14 text

USUAL TEST A A A 14

Slide 15

Slide 15 text

Arrange: set up preconditions A A 15 USUAL TEST

Slide 16

Slide 16 text

Arrange: set up preconditions Act: execute operation we’re testing A 16 USUAL TEST

Slide 17

Slide 17 text

Arrange: set up preconditions Act: execute operation we’re testing Assert: verify results 17 USUAL TEST

Slide 18

Slide 18 text

18 USUAL TEST Arrange: set up preconditions Act: execute operation we’re testing Assert: verify results

Slide 19

Slide 19 text

19 class User < ApplicationRecord end

Slide 20

Slide 20 text

20 class User < ApplicationRecord end it 'destroys user’ do user = User.create! user.destroy expect(User.count).to eq(0) end

Slide 21

Slide 21 text

21 arrange act assert class User < ApplicationRecord end it 'destroys user’ do user = User.create! user.destroy expect(User.count).to eq(0) end

Slide 22

Slide 22 text

22 class User < ApplicationRecord end it 'destroys user’ do user = User.create! user.destroy expect(User.count).to eq(0) end

Slide 23

Slide 23 text

23 class User < ApplicationRecord has_many :notes end class Note < ApplicationRecord belongs_to :user end it 'destroys user’ do user = User.create! user.destroy expect(User.count).to eq(0) end

Slide 24

Slide 24 text

24 class User < ApplicationRecord has_many :notes end class Note < ApplicationRecord belongs_to :user end it 'destroys user with a note’ do user = User.create!(note: Note.create!) user.destroy expect(User.count).to eq(0) end

Slide 25

Slide 25 text

25 class User < ApplicationRecord has_many :notes end class Note < ApplicationRecord belongs_to :user end it 'destroys user with a note’ do user = User.create!(note: Note.create!) user.destroy expect(User.count).to eq(0) end

Slide 26

Slide 26 text

26 class User < ApplicationRecord has_many :notes end class Note < ApplicationRecord belongs_to :user end ActiveRecord : : InvalidForeignKey: PG : : ForeignKeyViolation: ERROR : update or delete on table "users" violates foreign key constraint “fk_rails_83d9817008" on table "notes" DETAIL : Key (id)=(1) is still referenced from table “notes".

Slide 27

Slide 27 text

27 class User < ApplicationRecord has_many :notes, dependent: :destroy end class Note < ApplicationRecord belongs_to :user end it 'destroys user with a note’ do user = User.create!(note: Note.create!) user.destroy expect(User.count).to eq(0) end

Slide 28

Slide 28 text

28 class User < ApplicationRecord has_many :notes, dependent: :destroy end class Note < ApplicationRecord belongs_to :user end it 'destroys user with a note’ do user = User.create!(note: Note.create!) user.destroy expect(User.count).to eq(0) end

Slide 29

Slide 29 text

STATE COMBINATIONS 29

Slide 30

Slide 30 text

STATE COMBINATIONS 30

Slide 31

Slide 31 text

STATE COMBINATIONS 31

Slide 32

Slide 32 text

STATE COMBINATIONS 32

Slide 33

Slide 33 text

STATE COMBINATIONS 33

Slide 34

Slide 34 text

STATE COMBINATIONS 34

Slide 35

Slide 35 text

35 1.Write more tests? STATE COMBINATIONS

Slide 36

Slide 36 text

36 1.Write more tests? 2.Randomize test data? STATE COMBINATIONS

Slide 37

Slide 37 text

1. Insuf fi ciency of usual tests 2. Model-based testing 3. Petri nets 4. Petri nets based testing

Slide 38

Slide 38 text

MODEL-BASED TESTING 38 1.Create model of the system.

Slide 39

Slide 39 text

MODEL-BASED TESTING 39 1.Create model of the system. 2.Generate tests based on this model.

Slide 40

Slide 40 text

GRAPHWALKER 40

Slide 41

Slide 41 text

yEd 41

Slide 42

Slide 42 text

EXAMPLE 42

Slide 43

Slide 43 text

43 EXAMPLE

Slide 44

Slide 44 text

44 EXAMPLE

Slide 45

Slide 45 text

45 EXAMPLE

Slide 46

Slide 46 text

46 EXAMPLE

Slide 47

Slide 47 text

47 EXAMPLE

Slide 48

Slide 48 text

48 EXAMPLE

Slide 49

Slide 49 text

GRAPHWALKER 1.Java or Python. 2.Finite-state machine. 49

Slide 50

Slide 50 text

FINITE-STATE MACHINE 50

Slide 51

Slide 51 text

51 FINITE-STATE MACHINE

Slide 52

Slide 52 text

52 FINITE-STATE MACHINE

Slide 53

Slide 53 text

53 FINITE-STATE MACHINE

Slide 54

Slide 54 text

54 FINITE-STATE MACHINE

Slide 55

Slide 55 text

55 FINITE-STATE MACHINE

Slide 56

Slide 56 text

1.Duplication. 2.Concurrency = state explosion. 56 FINITE-STATE MACHINE

Slide 57

Slide 57 text

1. Insuf fi ciency of usual tests 2. Model-based testing 3. Petri nets 4. Petri nets based testing

Slide 58

Slide 58 text

PETRI NET 58 not created Create User created

Slide 59

Slide 59 text

59 places store tokens not created Create User created PETRI NET

Slide 60

Slide 60 text

60 places store tokens transitions move tokens not created Create User created PETRI NET

Slide 61

Slide 61 text

61 places store tokens arcs connect places and transitions transitions move tokens not created Create User created PETRI NET

Slide 62

Slide 62 text

62 places store tokens arcs connect places and transitions transitions move tokens not created Create User created PETRI NET

Slide 63

Slide 63 text

63 places store tokens arcs connect places and transitions transitions move tokens not created Create User created PETRI NET

Slide 64

Slide 64 text

64 place not created has a token not created Create User created PETRI NET

Slide 65

Slide 65 text

65 transition Create User is enabled (can fi re) not created Create User created PETRI NET

Slide 66

Slide 66 text

66 fi ring removes token from not created and adds token to created not created Create User created PETRI NET

Slide 67

Slide 67 text

67 1. Places can only be connected to transitions (and vice versa). PETRI NET

Slide 68

Slide 68 text

68 1. Places can only be connected to transitions (and vice versa). 2. Transitions can fi re if every incoming place has at least one token. PETRI NET

Slide 69

Slide 69 text

69 1. Places can only be connected to transitions (and vice versa). 2. Transitions can fi re if every incoming place has at least one token. 3. Firing transition consumes (removes) one token from each incoming place and produces (adds) one token to each outgoing place. PETRI NET

Slide 70

Slide 70 text

not created Create User created 70 ip allowed PETRI NET

Slide 71

Slide 71 text

71 not created Create User created ip allowed not created Create User created ip allowed PETRI NET

Slide 72

Slide 72 text

72 pending review not created Create User created PETRI NET

Slide 73

Slide 73 text

73 pending review not created Create User created pending review not created Create User created PETRI NET

Slide 74

Slide 74 text

74 not created Create User created PETRI NET

Slide 75

Slide 75 text

75 PETRI NET not created Create User created not created Create User created

Slide 76

Slide 76 text

76 FINITE-STATE MACHINE

Slide 77

Slide 77 text

77 user not created user created note created PETRI NET

Slide 78

Slide 78 text

78 user not created user created note created Create User PETRI NET

Slide 79

Slide 79 text

79 user not created user created note created Create User Destroy User PETRI NET

Slide 80

Slide 80 text

80 user not created user created note created Create User Destroy User Create Note PETRI NET

Slide 81

Slide 81 text

81 user not created user created note created Create User Destroy User Create Note Destroy Note PETRI NET

Slide 82

Slide 82 text

82 user not created user created note created Create User Destroy User Create Note Destroy Note PETRI NET

Slide 83

Slide 83 text

83 user not created user created note created Create User Destroy User Create Note Destroy Note PETRI NET

Slide 84

Slide 84 text

84 user not created user created note created Create User Destroy User Create Note Destroy Note PETRI NET

Slide 85

Slide 85 text

FINITE-STATE MACHINE 85

Slide 86

Slide 86 text

86 user not created user created note created Create User Destroy User Create Note Destroy Note post created PETRI NET

Slide 87

Slide 87 text

87 user not created user created note created Create User Destroy User Create Note Destroy Note post created Create Post PETRI NET

Slide 88

Slide 88 text

88 user not created user created note created Create User Destroy User Create Note Destroy Note post created Create Post Destroy Post PETRI NET

Slide 89

Slide 89 text

89 FINITE-STATE MACHINE

Slide 90

Slide 90 text

90 user not created user created note created Create User Destroy User Create Note Destroy Note post created Create Post Destroy Post video created PETRI NET

Slide 91

Slide 91 text

91 user not created user created note created Create User Destroy User Create Note Destroy Note post created Create Post Destroy Post Create Video video created PETRI NET

Slide 92

Slide 92 text

92 user not created user created note created Create User Destroy User Create Note Destroy Note post created Create Post Destroy Post Create Video Destroy Video video created PETRI NET

Slide 93

Slide 93 text

1. Insuf fi ciency of usual tests 2. Model-based testing 3. Petri nets 4. Petri nets based testing

Slide 94

Slide 94 text

PETRI NETS BASED TESTING 94

Slide 95

Slide 95 text

1.Create model of the system using Petri net. 95 PETRI NETS BASED TESTING

Slide 96

Slide 96 text

1.Create model of the system using Petri net. 2.Generate tests based on this model. 96 PETRI NETS BASED TESTING

Slide 97

Slide 97 text

CREATE MODEL 97

Slide 98

Slide 98 text

98 { "places": [ { "guid": "e57c0830-148f-11e8-bb7f - adf9986e1043", "identifier": "user created" } ], "transitions": [ { "guid": “df65a6e0-148f-11e8-bb7f - adf9986e1043" "identifier": "Create User", } ], "arcs": [ { "from_guid": "e57c0830-148f-11e8-bb7f - adf9986e1043", "to_guid": “df65a6e0-148f-11e8-bb7f - adf9986e1043" } ] } CREATE MODEL

Slide 99

Slide 99 text

LOAD NET 99

Slide 100

Slide 100 text

100 class Node def input_arcs # .. . end def output_arcs # .. . end end LOAD NET

Slide 101

Slide 101 text

101 class Node def input_arcs # .. . end def output_arcs # .. . end end class Place < Node end LOAD NET

Slide 102

Slide 102 text

102 class Node def input_arcs # .. . end def output_arcs # .. . end end class Place < Node end class Transition < Node end LOAD NET

Slide 103

Slide 103 text

103 class Node def input_arcs # .. . end def output_arcs # .. . end end class Place < Node end class Transition < Node end class Arc def from # .. . end def to # .. . end end LOAD NET

Slide 104

Slide 104 text

104 class Runner def enabled?(transition) # .. . end def fire(transition) # .. . end def marking # .. . end end LOAD NET

Slide 105

Slide 105 text

LINK NET TO TEST CODE 105

Slide 106

Slide 106 text

106 user not created user created note created Create User Destroy User Create Note Destroy Note LINK NET TO TEST CODE

Slide 107

Slide 107 text

107 user not created user created note created Create User Destroy User Create Note Destroy Note class UserNoteNet < Rhizome :: Net end

Slide 108

Slide 108 text

108 user not created user created note created Create User Destroy User Create Note Destroy Note class UserNoteNet < Rhizome :: Net runner { Runner.new('user - note.bpf', marking: ['user not created']) } end

Slide 109

Slide 109 text

109 class UserNoteNet < Rhizome :: Net runner { Runner.new('user - note.bpf', marking: ['user not created']) } transition('Create User') { @user = User.create! } transition('Destroy User') { @user.destroy } end user not created user created note created Create User Destroy User Create Note Destroy Note

Slide 110

Slide 110 text

110 class UserNoteNet < Rhizome :: Net runner { Runner.new('user - note.bpf', marking: ['user not created']) } transition('Create User') { @user = User.create! } transition('Destroy User') { @user.destroy } transition('Create Note') { @note = Note.create!(user: @user) } transition('Destroy Note') { @note.destroy } end user not created user created note created Create User Destroy User Create Note Destroy Note

Slide 111

Slide 111 text

111 class UserNoteNet < Rhizome :: Net runner { Runner.new('user - note.bpf', marking: ['user not created']) } transition('Create User') { @user = User.create! } transition('Destroy User') { @user.destroy } transition('Create Note') { @note = Note.create!(user: @user) } transition('Destroy Note') { @note.destroy } place('user not created') do empty { expect(User.count).to be > 0 } filled { expect(User.count).to eq(0) } end end user not created user created note created Create User Destroy User Create Note Destroy Note

Slide 112

Slide 112 text

112 class UserNoteNet < Rhizome :: Net runner { Runner.new('user - note.bpf', marking: ['user not created']) } transition('Create User') { @user = User.create! } transition('Destroy User') { @user.destroy } transition('Create Note') { @note = Note.create!(user: @user) } transition('Destroy Note') { @note.destroy } place('user not created') do empty { expect(User.count).to be > 0 } filled { expect(User.count).to eq(0) } end place('user created') do empty { expect(User.count).to eq(0) } filled { expect(User.count).to be > 0 } end end user not created user created note created Create User Destroy User Create Note Destroy Note

Slide 113

Slide 113 text

class UserNoteNet < Rhizome :: Net runner { Runner.new('user - note.bpf', marking: ['user not created']) } transition('Create User') { @user = User.create! } transition('Destroy User') { @user.destroy } transition('Create Note') { @note = Note.create!(user: @user) } transition('Destroy Note') { @note.destroy } place('user not created') do empty { expect(User.count).to be > 0 } filled { expect(User.count).to eq(0) } end place('user created') do empty { expect(User.count).to eq(0) } filled { expect(User.count).to be > 0 } end place('note created') do empty { expect(Note.count).to eq(0) } filled { expect(Note.count).to be > 0 } end end user not created user created note created Create User Destroy User Create Note Destroy Note 113

Slide 114

Slide 114 text

TRAVERSE NET 1.Give every transition same probability (4 transitions = 0.25 to each). 114

Slide 115

Slide 115 text

TRAVERSE NET 1.Give every transition same probability (4 transitions = 0.25 to each). 2.Generate random number - a threshold of transition selection. 115

Slide 116

Slide 116 text

TRAVERSE NET 1.Give every transition same probability (4 transitions = 0.25 to each). 2.Generate random number - a threshold of transition selection. 3.Select the fi rst transition which is enabled and has probability suitable for the threshold. 116

Slide 117

Slide 117 text

TRAVERSE NET 1.Give every transition same probability (4 transitions = 0.25 to each). 2.Generate random number - a threshold of transition selection. 3.Select the fi rst transition which is enabled and has probability suitable for the threshold. 4.Fire transition. 117

Slide 118

Slide 118 text

TRAVERSE NET 1.Give every transition same probability (4 transitions = 0.25 to each). 2.Generate random number - a threshold of transition selection. 3.Select the fi rst transition which is enabled and has probability suitable for the threshold. 4.Fire transition. 5.Verify empty and fi lled places. 118

Slide 119

Slide 119 text

TRAVERSE NET 1.Give every transition same probability (4 transitions = 0.25 to each). 2.Generate random number - a threshold of transition selection. 3.Select the fi rst transition which is enabled and has probability suitable for the threshold. 4.Fire transition. 5.Verify empty and fi lled places. 6.Halve selected transition probability. 119

Slide 120

Slide 120 text

TRAVERSE NET 1.Give every transition same probability (4 transitions = 0.25 to each). 2.Generate random number - a threshold of transition selection. 3.Select the fi rst transition which is enabled and has probability suitable for the threshold. 4.Fire transition. 5.Verify empty and fi lled places. 6.Halve selected transition probability. 7.If all transitions fi red at least once - stop. Otherwise, repeat from point 2. 120

Slide 121

Slide 121 text

121 $ bin/rhizome Traversing user_note net: Initial marking: user not created

Slide 122

Slide 122 text

122 $ bin/rhizome Traversing user_note net: Initial marking: user not created Executing Create User New marking: user created Transitions left: Destroy User, Create Note, Destroy Note

Slide 123

Slide 123 text

123 $ bin/rhizome Traversing user_note net: Initial marking: user not created Executing Create User New marking: user created Transitions left: Destroy User, Create Note, Destroy Note Executing Create Note New marking: user created, note created Transitions left: Destroy User, Destroy Note

Slide 124

Slide 124 text

124 $ bin/rhizome Traversing user_note net: Initial marking: user not created Executing Create User New marking: user created Transitions left: Destroy User, Create Note, Destroy Note Executing Create Note New marking: user created, note created Transitions left: Destroy User, Destroy Note Executing Destroy Note New marking: user created Transitions left: Destroy User

Slide 125

Slide 125 text

125 $ bin/rhizome Traversing user_note net: Initial marking: user not created Executing Create User New marking: user created Transitions left: Destroy User, Create Note, Destroy Note Executing Create Note New marking: user created, note created Transitions left: Destroy User, Destroy Note Executing Destroy Note New marking: user created Transitions left: Destroy User Executing Destroy User New marking: user not created Finished traversing user_note net.

Slide 126

Slide 126 text

126 $ bin/rhizome Traversing user_note net: Initial marking: user not created

Slide 127

Slide 127 text

127 $ bin/rhizome Traversing user_note net: Initial marking: user not created Executing Create User New marking: user created Transitions left: Destroy User, Create Note, Destroy Note

Slide 128

Slide 128 text

128 $ bin/rhizome Traversing user_note net: Initial marking: user not created Executing Create User New marking: user created Transitions left: Destroy User, Create Note, Destroy Note Executing Destroy User New marking: user not created Transitions left: Create Note, Destroy Note

Slide 129

Slide 129 text

129 $ bin/rhizome Traversing user_note net: Initial marking: user not created Executing Create User New marking: user created Transitions left: Destroy User, Create Note, Destroy Note Executing Destroy User New marking: user not created Transitions left: Create Note, Destroy Note Executing Create User New marking: user created Transitions left: Create Note, Destroy Note

Slide 130

Slide 130 text

130 $ bin/rhizome Traversing user_note net: Initial marking: user not created Executing Create User New marking: user created Transitions left: Destroy User, Create Note, Destroy Note Executing Destroy User New marking: user not created Transitions left: Create Note, Destroy Note Executing Create User New marking: user created Transitions left: Create Note, Destroy Note Executing Create Note New marking: user created, note created Transitions left: Destroy Note

Slide 131

Slide 131 text

131 $ bin/rhizome Traversing user_note net: Initial marking: user not created Executing Create User New marking: user created Transitions left: Destroy User, Create Note, Destroy Note Executing Destroy User New marking: user not created Transitions left: Create Note, Destroy Note Executing Create User New marking: user created Transitions left: Create Note, Destroy Note Executing Create Note New marking: user created, note created Transitions left: Destroy Note Executing Destroy Note New marking: user created Finished traversing user_note net.

Slide 132

Slide 132 text

132 $ bin/rhizome Traversing user_note net: Initial marking: user not created

Slide 133

Slide 133 text

133 $ bin/rhizome Traversing user_note net: Initial marking: user not created Executing Create User New marking: user created Transitions left: Destroy User, Create Note, Destroy Note

Slide 134

Slide 134 text

134 $ bin/rhizome Traversing user_note net: Initial marking: user not created Executing Create User New marking: user created Transitions left: Destroy User, Create Note, Destroy Note Executing Create Note New marking: user created, note created Transitions left: Destroy User, Destroy Note

Slide 135

Slide 135 text

135 $ bin/rhizome Traversing user_note net: Initial marking: user not created Executing Create User New marking: user created Transitions left: Destroy User, Create Note, Destroy Note Executing Create Note New marking: user created, note created Transitions left: Destroy User, Destroy Note Executing Destroy User 
 ActiveRecord :: InvalidForeignKey: PG : : ForeignKeyViolation: ERROR : update or delete on table "users" violates foreign key constraint "fk_rails_83d9817008" on table "notes" DETAIL : Key (id)=(1) is still referenced from table “notes".

Slide 136

Slide 136 text

RHIZOME 1. Reproducible tests using seed. 136

Slide 137

Slide 137 text

RHIZOME 1. Reproducible tests using seed. 2. Parallelize like any other test framework (parallel_tests). 137

Slide 138

Slide 138 text

RHIZOME 1. Reproducible tests using seed. 2. Parallelize like any other test framework (parallel_tests). 3. General purpose framework (API, UI). 138

Slide 139

Slide 139 text

USUAL TEST (RSPEC) 139 RHIZOME

Slide 140

Slide 140 text

RHIZOME 1000 LoC 140 100 LoC USUAL TEST (RSPEC)

Slide 141

Slide 141 text

RHIZOME 1000 LoC 1m 141 100 LoC 1m USUAL TEST (RSPEC)

Slide 142

Slide 142 text

1. Test coverage increased. 142 PETRI NETS BASED TESTING

Slide 143

Slide 143 text

1. Test coverage increased. 2. Time to run tests is the same. 143 PETRI NETS BASED TESTING

Slide 144

Slide 144 text

1. Test coverage increased. 2. Time to run tests is the same. 3. Time to write and support tests decreased. 144 PETRI NETS BASED TESTING

Slide 145

Slide 145 text

P.S. What else?

Slide 146

Slide 146 text

146 user not created user created note created Create User Destroy User Create Note Destroy Note

Slide 147

Slide 147 text

147 user not created user created note created Create User Destroy User Create Note Destroy Note

Slide 148

Slide 148 text

148 user not created user created note created Create User Destroy User Create Note Destroy Note

Slide 149

Slide 149 text

149 user not created user created note created Create User Destroy User Create Note Destroy Note

Slide 150

Slide 150 text

150 user not created user created note created Create User Destroy User Create Note Destroy Note

Slide 151

Slide 151 text

RESET ARC 151 user not created user created note created Create User Destroy User Create Note Destroy Note clears place after fi ring

Slide 152

Slide 152 text

INHIBITOR ARC 152 user created note created Create User Destroy User Create Note Destroy Note enables transition only if connected place has no tokens

Slide 153

Slide 153 text

user not created user created Create User Destroy User HIERARCHICAL PETRI NET 153 Note note created Create Note Destroy Note

Slide 154

Slide 154 text

PETRI NET 154 user not created user created note created Create User Destroy User Create Note Destroy Note

Slide 155

Slide 155 text

COLORED PETRI NET 155 user not created user created note created Create User Destroy User Create Note Destroy Note token stores data

Slide 156

Slide 156 text

DELAYED TRANSITIONS TIMED PETRI NETS STOCHASTIC PETRI NETS ANALYSIS ALGORITHMS … 156

Slide 157

Slide 157 text

🙇 Alex Rodionov @p0deje