PR:この記事にはアフィリエイトリンクが含まれます。
プロパティベーステスト(性質ベーステスト)は、入力例を一件ずつ並べる代わりに、守るべきルールと入力の作り方を決めて幅広い値で挙動を確かめる手法です。
境界値を見落としたり、入力の組み合わせが増えて例を用意しきれなかったりするときに役立ちます。失敗を起こした入力を小さく示す機能もあります。
QuickCheck、Hypothesis、PropErは、対象言語も本で学べる深さも異なります。紹介する4冊はHaskell、Python、Erlang、Elixirのテストを扱っています。
4冊の早見表
| 本 | 主な対象 | プロパティテストの内容 | おすすめの読者 |
|---|---|---|---|
Property-Based Testing with PropEr, Erlang, and Elixir | Erlang、Elixir | 生成器、縮小、状態機械 | PropErを中心に学びたい人 |
Testing Elixir | Elixir | StreamData、性質設計、stateful testing | Elixirのテスト全体を学びたい人 |
Soar with Haskell | Haskell | 第16章でQuickCheck、生成器、縮小 | Haskellと一緒に基礎を学びたい人 |
Robust Python | Python | 第23章でHypothesisとstrategies | Pythonのテスト戦略も学びたい人 |
専用書と、言語やテスト全般を扱う本では、プロパティテストに割くページ数が異なります。ライブラリ名に加えて、生成器や縮小をどこまで扱うかも確認してください。
QuickCheckを扱う本はHaskellの入門書、Hypothesisを扱う本はPythonの保守性を学ぶ本です。該当章以外にもテーマがあるので、対象言語の学習も兼ねたい人には内容の広さが利点になります。
PropErの本は性質テストを主題にしています。Elixirの本はStreamDataを使い、ExUnitやPhoenixを含むテストを扱います。学んでいる言語と本の範囲を比べると、違いが見えてきます。
性質テストの基本
従来のテストでは、入力ごとに期待する結果を一組ずつ書きます。性質テストは、対象となる入力で守るルールを示し、生成された値にも当てはまるかを確かめます。
たとえば並べ替え関数なら、結果が順序どおりであることや、元の要素が増減していないことを性質にできます。具体的な出力を毎回用意せず、不変条件から幅広い入力を調べられます。
ランダムに値を作るだけでは十分ではありません。仕様に合った値や境界付近の値を生成できるかで、見つかる不具合は変わります。生成器の設計もテスト設計の一部です。
失敗時の縮小は、問題を起こした長い入力や複雑な状態遷移を、より小さな例に近づけます。短い反例なら原因を追いやすく、大量のログを読む負担も減らせます。
QuickCheckの入口
『Soar with Haskell: The ultimate beginners’ guide to mastering functional programming from the ground up』は、Haskellと関数型プログラミングを基礎から学ぶ418ページの本です。プログラミング経験があり、Haskellを学びたい読者を対象にしています。
QuickCheckを扱う第16章では、プロパティのケーススタディに加えて、Arbitraryによる生成器、独自生成器、縮小、ユーザー定義の縮小を学べます。入力を用意し、反例を扱うところまで追える内容です。
本書はHaskellと関数型プログラミングの入門書で、QuickCheckもその一章で扱います。高度なテスト手法だけを急いで補いたいHaskell経験者には、周辺の章が回り道になることもあります。
QuickCheckの考え方を関数型プログラミングと一緒に学びたい人におすすめです。Haskell未経験でも、言語を学ぶ目的があるなら本全体を読む価値があります。
Hypothesisの章
『Robust Python: Write Clean and Maintainable Code』は、型や拡張性、テスト戦略など、Pythonコードの保守性を幅広く扱う378ページの本です。中級から上級のPython読者が対象で、Hypothesisを実務のテスト改善と結びつけて学べます。
第23章ではHypothesisを取り上げ、従来のテストとの比較、strategies、データ生成の仕組みを扱います。どんな入力をどう用意するかを考える材料になります。
本全体では受け入れテスト、静的解析、mutation testingも扱います。Pythonプロジェクトのテストや保守性をまとめて見直す人には、ほかの章も役立ちます。
目次では縮小が独立した項目になっていません。縮小や反例の扱いを重点的に学ぶなら、PropErの本や『Soar with Haskell』が合います。参考価格はUS$55.99で、実売価格は販売店や時期によって変わります。
PropErの専門書
『Property-Based Testing with PropEr, Erlang, and Elixir: Find Bugs Before Your Users Do』は、PropErを主題にした374ページの本です。Erlangの基礎知識が必要で、Elixirで読む場合も基本を押さえていると進めやすくなります。
statelessな性質の設計から、標準生成器、独自データ生成器、失敗例の縮小へと進みます。性質の表し方も実例とともに学べるのが特徴です。
さらにtargeted properties、状態遷移、有限状態機械を扱います。単体テストから統合テスト、システムテストまで範囲が広く、状態を持つ処理の検証を学べます。
ElixirではPropCheckラッパーを使います。ErlangまたはElixirの基礎があり、生成器や状態機械まで詳しく学びたい人は本書を選ぶとよいでしょう。
Elixirを広く学ぶ
『Testing Elixir: Effective and Robust Testing for Elixir and its Ecosystem』は、ExUnitやMixを含むElixirのテスト全般を扱う262ページの本です。Elixir 1.8以降とErlang OTP 21以降を使う読者が対象です。
プロパティテストの章ではStreamDataを使い、データ生成、性質の記述、縮小、性質設計、stateful testingを扱います。既存のテスト環境で性質テストを学びたいElixir読者に合う構成です。
本書はOTP、Ecto、Phoenixを使った単体・統合・エンドツーエンドテストも扱い、アプリケーションのテストを広く学べます。
PropErを深く学ぶなら専用書、Elixirのテスト環境でStreamDataを学ぶなら『Testing Elixir』をおすすめします。プロジェクトのテストをまとめて学び直したい人にも適しています。
失敗例が教えること
性質テストは正しい仕様を自動で決める仕組みではありません。ルールが曖昧なら、何件入力を生成しても大事な誤りを見逃します。まず、テストしたいルールを明確にしましょう。
生成器も確認したい点です。実際にあり得る入力を作れているか、境界の値や空の値を含むか。生成数を増やす前に、対象の処理に合った入力範囲を考える必要があります。
縮小された反例は失敗の原因を絞る手がかりです。修正後は、その最小例を通常の回帰テストにも残し、同じ不具合の再発を防ぎましょう。生成テストと例示テストは役割を補い合います。
状態機械のテストでは、一つの入力値より操作の順番が問題になることもあります。状態遷移を扱う本なら、呼び出しの組み合わせで起きる不具合まで学べます。学ぶ深さは検証したい処理の複雑さで変わります。
結論
QuickCheckと一緒にHaskellも学ぶなら『Soar with Haskell』、Pythonのテスト戦略とHypothesisを見直すなら『Robust Python』をおすすめします。どちらもプロパティテスト以外のテーマを含みます。
ErlangやElixirでPropEr、生成器、縮小、状態機械を詳しく学びたい人には専用書が最適です。ElixirのプロジェクトでStreamDataとExUnitを含むテスト全体を整えるなら『Testing Elixir』が合います。
決め手は、使っている言語と学びたい範囲です。自分の環境に合い、知りたい深さまで扱う本なら、読んだ内容を手元のテストへつなげやすくなります。
Amazon の PC をスコア化してみた
Amazonにある8〜14インチの小型WindowsタブレットやノートPCを、スペック別にスコア化して比較・ランキング。





