2016-08-10 4 views
1

ライブラリはsrcディレクトリにあり、データ定義があります。A.テストに関するコードは、多くのチュートリアルで示唆されているように、テストディレクトリにあります。シリアル・インスタンスは、テストケースを生成し、以下のリンクを参照します testing(tasty-smallcheck)とファイル構成と孤立インスタンスの回避

instance Monad m => Serial m A where ... 

cabal test

が、これは孤児インスタンスであることを警告しています。これはやむを得ないことですか、またはlibsを編成するための確立された規約がありますか?たとえば、シリアルインスタンス定義をデータAが定義されている場所に移動しますか?後者はテストディレクトリに関連するものをテストし続けるのが良いと思うので、何とか間違っていると感じます。これが典型的な方法であれば、どのような方法でパブリックインターフェイスでテスト関連のものが公開されるのを避けることができますか?テストされたすべてのモジュール(パブリックモジュールと実際のテストプログラムが使用する)の「内部」バージョンを記述しますか?同様のものが unit-testing questionに示唆されました。

これはまったく問題ですか?関連するコードをテストする際に孤立したインスタンスを残すことはどれほど難しいでしょうか?それは、関連するコードをテストで孤児のインスタンスを残すためにどのように悪い慣習


SmallCheck: Making types instance of typeclass Serial

How to use SmallCheck in Haskell?

+0

実践では実例コードでインスタンスを宣言しているようですが、私も嫌いです。私の個人的なプロジェクトでは、私は孤立したインスタンスと一緒に暮らすことができると思います。しかし、生産コードにこれらのインスタンスを含めることは面白いかもしれません。なぜなら、他の人があなたのデータ型について新しいテストを構築しやすくなるからです。 –

+1

@ Jean-BaptistePotonnier、内部テストに使用される「任意の」インスタンスは、あなたが公開したいものと意図的に異なる場合があります。たとえば、バランスのとれたツリーの実装が最大限にアンバランスなツリーでも機能することを確認したい場合があります。 – dfeuer

+0

@dfeuer私は見る!私は、データの異なる分布について異なるインスタンスを持つ、いくつかのパフォーマンステストを行うことも想像することができます。 –

答えて

1

あまりありません。私はここで@Potonnierに同意します。孤児のインスタンスはHaskell's open-world assumptionのために不愉快ですが、テスト可能な実行可能ファイルのターゲットはかなり閉鎖された世界だと主張します。テスト実行可能パッケージによって提供されるモジュールを誰もインポートしないこと、そしてそこにあるモジュールが依存グラフの「葉」であることは合理的に期待できます。それが本当である限り、孤立したインスタンスが最悪の場合のシナリオにつながるシナリオを想像するのは難しいでしょう。偽陽性のようなものです。これはバイナリの決定ではありませんが、ここでのコスト便益分析は、テストライブラリを依存関係として含めることに比べて重視されると思います。

関連する問題