Property-based Testingという概念があることを知りましたので、元ネタを読んでみました。
Jessica Kerrさんのこの記事に、定義が書かれています。
Property-based testingでは、入力に対するコードの出力に関するstatementを作成する。多数のありうる入力値について、このstatementが検証される。
ここでいうstatementって何だ?
PropertyとExample
Property-based testingでは、フレームワークが入力値を生成して、コードに対して繰り返し検証を行うとあります。これを読んで、「ファズテストみたいなもの?」と思ったのですが、全然違いました。
記事では、Property-based testingの対照概念を、Example-based testingとしています。
Example-based testingとは、無数にある値から何がしかの基準で入力値を選択し、その入力値でコードを動かして、出力値と事後状態を確認する。つまり、普通に行われているテストですよね。
Property-based testingでは、一つのテストで数百個の入力に対する結果を検証します。
ここで検証するのは、個々の入力に対するそれぞれの出力そのものではなく、(有効な)入力「群」に対する出力「群」のすべてが、statementで規定された性質(property)を満たしていることです。
ScalaTestというツールのサイトでは、propertyを、「さまざまなデータポイントにおいて維持されるべき、ハイレベルな振る舞いの仕様」としています。
たとえば
たとえば2つの自然数の足し算を行うメソッドがあるとして。
「3, 4」という入力に対して「7」が出力されることを確認するのが従来のExample-based testing。
出力がもつべきpropertyとして、たとえば「出力値は自然数である」「出力値は、どちらの入力値よりも1以上大きい」といったstatementを定義し、多数の入力ペアについてこのstatementを検証するのがProperty-based testingと考えればよいでしょうか。
元記事には、もう少し具体的なpropertyの例や、この手法の欠点なども書かれていますので、一読をおすすめします。
Example-basedと排他的なものではなく、補完し合うものだという点にも言及しています。これまで当たり前と思っていたテストケースの概念を覆されますね。
なお、Property-based testingをHaskellで行うツール、QuickCheckについての解説が、以下にありました。関数型言語の世界のみなさんには常識的なテスト技法なんでしょうか。Excel関数型言語しか使っていないのでわかりません!