Slide 1

Slide 1 text

Property-Based Testing in Rust
 @matsu7874 2020/06/30 Shinjuku.rs

Slide 2

Slide 2 text

自己紹介 matsu7874 ● フォルシア株式会社 ○ Webエンジニア ○ インメモリデータベース開発(Rust)

Slide 3

Slide 3 text

目次 ● 課題 ● Property-Based Testingとは ● サンプルプログラム ● QuickCheck ● Proptest ● まとめ

Slide 4

Slide 4 text

課題 ● テストコードのメンテナンスが高コスト ● テスト用のオブジェクト作成が面倒

Slide 5

Slide 5 text

Property-Based Testingとは ● 満たすべき性質に注目して検証するテスト手法 ○ 例 ■ vec == reverse(reverse(vec)) ■ add(a, b) == add(b, a) ● 多くの入力を自動生成し、それぞれの入力で仕様が 満たされていることを確認する。 ● 入力と期待する出力の組を与えるのは、 Example-Based Testing。

Slide 6

Slide 6 text

サンプルプログラム ● 荷物を検索するプログラムを考える。 ○ 荷物 ○ クエリ

Slide 7

Slide 7 text

荷物を表す構造体 サンプルプログラム

Slide 8

Slide 8 text

荷物のパラメータを検証するメソッド サンプルプログラム

Slide 9

Slide 9 text

初期値・境界値のテスト サンプルプログラム

Slide 10

Slide 10 text

検索クエリを表す構造体 サンプルプログラム

Slide 11

Slide 11 text

荷物を適合判定するメソッド サンプルプログラム

Slide 12

Slide 12 text

荷物の集合から検索する関数 サンプルプログラム

Slide 13

Slide 13 text

QuickCheck

Slide 14

Slide 14 text

QuickCheckは古参 QuickCheck

Slide 15

Slide 15 text

QuickCheckは型から自動生成 ● HaskellのQuickCheckのRust移植版 ● 型情報から入力値を生成する ○ Arbitrary Trait ■ 標準的な型には実装済み ● usize, Vec, Stringなど ■ 独自定義の型にはTraitの実装が必要 QuickCheck

Slide 16

Slide 16 text

自動生成するための Arbitrary Trait QuickCheck

Slide 17

Slide 17 text

QuickCheckを使ったテスト QuickCheck

Slide 18

Slide 18 text

Proptest

Slide 19

Slide 19 text

Proptestは後発 Proptest

Slide 20

Slide 20 text

Proptestは値の範囲指定ができる ● Hypothesis inspired ● 型に加えて値の範囲が指定できる ● 入力に依存関係があるケースも定義できる Proptest

Slide 21

Slide 21 text

Proptestを使ったテスト Proptest

Slide 22

Slide 22 text

Proptestは QuickCheckの上位互換ではない Proptest

Slide 23

Slide 23 text

まとめ ● Property-Based Testing ○ 性質に注目するテスト手法 ○ 大量の入力を自動生成して検証する ● QuickCheck ○ 型から入力を自動生成 ○ 一般的なアルゴリズムの検証に使いやすい ● Proptest ○ QuickCheckより高機能 ■ 入力の依存関係が定義できる ○ ドメイン固有のロジックに使いやすい