Scala祭でscalatest作者とproperty based testingの話をした

明らかに祭の1日目の一番の収穫でした。



scalatest作者とは、Bill Vennersさんです。コップ本の共著者だったりもする方です。

https://github.com/bvenners



まず、Scala祭の半年くらい前(?)の2015年6月頃の話

  • twitterで急にDM来たり、eed3si9nさんに仲介してもらってメールのやりとりする
    • 具体例にはCogen(Coarbitrary)について聞かれて、scalapropsの作成経緯含め答えた覚え
  • それで、その返信で
    • scalapropsの一部取り込むことも考えてるんだけど、その場合のライセンスが(ry
    • https://github.com/japgolly/nyaya も試したり、さらにscala.js対応もやろうとして
    • 現状こんな感じでscalatest内にGenerator入れて試してるんだけど

みたいな内容でした。たぶん。
しかしその後自分が返信せずに半年あいて、祭当日。



メール & gitterで
「吉田さんがScala祭に来てるってeed3si9nさんから聞いて、会って話したい」
みたいな直々なご指名が来る。



うごごごごご・・・・




eed3si9nさんじゃなく、結局OE_uiaさんに通訳してもらって懇親会で話す。
以前メールで話したことの内容と似たような話の他に

  • nyaya試したけどやっぱりやめて今は一旦またscalacheckに戻った(?)
  • "境界(の値)"を表現するclass https://github.com/scalatest/scalatest/blob/release-3.0.0-M15-for-scala-2.11-and-2.10/scalatest/src/main/scala/org/scalatest/prop/Edges.scala を作っていて、それの動作や現状抱えている問題について説明うける。どう思う?みたいなこと聞かれたので答える
  • IntのEdgeが5つあるとして、property based testingのテストケースが(Int, Int)だったら5 ✕ 5で25だけど、現状(実装がまずくて?)25通り生成されない(?)
  • scalacheckは必要以上にedgeケースを重複してテストしてしまう?とにかく無駄なテストや、無駄な時間を排除したいんだ!みたいな気持ちが伝わってくる(?)
  • そのあたりの問題についてどう思う?と聞かれる
  • 「いや、そもそも25程度ならいいけど、いずれにせよ組み合わせ爆発起こったら全部のEdgeの組み合わせやるの現実的じゃないし」みたいなこと答える
  • たしかに全部の組み合わせをテストしようとは思ってなくて(以下ちゃんと返答覚えてないというか、うまく書けないので略)
  • 同じ引数でのテストしてしまうパターンを完全に排除できてない点において、scalapropsもscalacheckと似たような問題は抱えてるはずだが、汎用的にうまく実装するの難しいと思ってる、なども答える
  • とにかくscalapropsのほうが純粋関数型でscalacheckに比べて(Generatorまわりが?全体が?)よい、みたいなこと言われる
  • ところでやっぱりScala.js対応つらい、みたいに、話が微妙に逸れたりもする。JVMとJSで数値が違うとか
  • scalacheckで、同じ引数でテストが実行されてしまうのは問題だけれど、それとは別にそれ以上に問題だと思っていることがあって、そこがscalapropsを作ることになった大きな動機の一つです、みたいに多少こっちから話をふる
  • 具体例には、scalacheckはグローバルで一つの設定(maxSizeやminSuccessfulなどの値)しか持てない。多少無駄なテストが発生しても、個々のテストがすぐに終わるなら、(デフォルトの100回ではなく)1000回テストしても全然現実的に問題にならないケースが有る
  • そのパラメータの細かい指定どうやって実装されてるの?と聞かれる
  • ちょっと待ってください(おもむろにPCを取り出す @xuwei_k 氏)
  • Endo[Param]の説明をする
  • scalacheckはそれがないせいで、こんな指定してて辛いんだよ、みたいなのを伝える
  • こんな指定、とは、一部の遅いテストに引きずられて、デフォルトのmaxSize 100, minSuccessful 100よりかなり小さい(maxSize 5, minSuccessful 33)
  • ところでscalazでworker 1指定してるのは? => なんだろ、結構昔からこうだし、よく知らないですねー、みたいな酷い(?)返しをする
  • 自分が言いたかったscalacheckのparameter細かく指定できなくて辛い問題は、たぶんなんとなく伝わった気がする?
  • property based testing対応とscala.js対応大変だし、今年中に完成すればいいな?みたいな感覚らしい?
    • えっ、つまりそれは3.0なの?3.0のfinalはまだ結構時間かかるの?とか内心思ったけど声に出さず
  • scalajsつらくないの?scalatestは昔からあって(or コード多いから?)辛いんだよ、とか言われたけど、scalapropsとかを対応させるうえでは、scalatestほどは辛くないよ(?)みたいな返しする
  • 大体満足したよ(?)ありがとう、もっとproperty based testing勉強するよ、みたいなこと言われた


上記に書いたの、実際に話をした順は、たぶん結構前後してるけど、覚えてる範囲の重要なのはそんなところ。他にも細かい話をした気がする。

OE_uiaさんありがとうございました。


そして、おえさん経由で翻訳してもらったやつをさらに記憶をもとに書いてるので、Billさんのもとの意志とはだいぶずれてしまってる可能性あるが、まぁ仕方ないですね(?)



おおまかには予想ついてたけど、なるほどやはりproperty based testing細かいところまで考えると色々あるな(小並感


scalatestが3.0で実験的に実装してるRandomizerやEdgesクラスの設計に関して思うところはあるが、長くなるのでそれは別の機会に気が向いたら書くかもしれない。