Property-Based Testing in Rust

Property-Based Testing in Rust

I present how to use QuickCheck and Proptest.
QuickCheck is useful for general algorisms and Proptest is useful for domain logics.

The LT was performed at Shinjuku.rs#10 (https://forcia.connpass.com/event/178415/) on 2020/06/30.

F0493f5bcb4cc9fdccc54ae3e8ab6bd0?s=128

Kentaro Matsumoto

June 30, 2020
Tweet

Transcript

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

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

  3. 目次 • 課題 • Property-Based Testingとは • サンプルプログラム • QuickCheck

    • Proptest • まとめ
  4. 課題 • テストコードのメンテナンスが高コスト • テスト用のオブジェクト作成が面倒

  5. Property-Based Testingとは • 満たすべき性質に注目して検証するテスト手法 ◦ 例 ▪ vec == reverse(reverse(vec))

    ▪ add(a, b) == add(b, a) • 多くの入力を自動生成し、それぞれの入力で仕様が 満たされていることを確認する。 • 入力と期待する出力の組を与えるのは、 Example-Based Testing。
  6. サンプルプログラム • 荷物を検索するプログラムを考える。 ◦ 荷物 ◦ クエリ

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

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

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

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

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

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

  13. QuickCheck

  14. QuickCheckは古参 QuickCheck

  15. QuickCheckは型から自動生成 • HaskellのQuickCheckのRust移植版 • 型情報から入力値を生成する ◦ Arbitrary Trait ▪ 標準的な型には実装済み

    • usize, Vec<A>, Stringなど ▪ 独自定義の型にはTraitの実装が必要 QuickCheck
  16. 自動生成するための Arbitrary Trait QuickCheck

  17. QuickCheckを使ったテスト QuickCheck

  18. Proptest

  19. Proptestは後発 Proptest

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

  21. Proptestを使ったテスト Proptest

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

  23. まとめ • Property-Based Testing ◦ 性質に注目するテスト手法 ◦ 大量の入力を自動生成して検証する • QuickCheck

    ◦ 型から入力を自動生成 ◦ 一般的なアルゴリズムの検証に使いやすい • Proptest ◦ QuickCheckより高機能 ▪ 入力の依存関係が定義できる ◦ ドメイン固有のロジックに使いやすい