0

「Joshua Bloch TDD」をグーグルで検索したところ...あまり出てきませんでした。この件について彼が何を言わなければならないかを本当に知りたいので、これは非常に残念です。

項目 13 (第 2 版を見ています) は、「クラスとメンバーのアクセシビリティを最小限に抑える」というタイトルです。数ページの後、彼は次のように述べています。

テストを容易にするために、クラス、インターフェイス、またはメンバー* をよりアクセスしやすくしたくなるかもしれません。... public クラスの private メンバーをテストするために package-private にすることは許容されますが、アクセシビリティをそれ以上に高めることは許容されません... 幸いなことに、それも必要ではありません。テストは、テスト対象のパッケージの一部として実行できるため、そのパッケージ プライベート要素にアクセスできます。

* 「メンバー」とは、「フィールド、メソッド、ネストされたクラス、およびネストされたインターフェース」を意味します。

TDD初心者ですが、徐々に足を踏み入れていると、現在のコンセンサスには、アプリコードパッケージを使用したテストクラスが含まれていないようであり、src\testとsrc\mainの下に一致する構造さえも含まれていないようです。ほとんどがTDDです。専門家は別の方法でテスト用ディレクトリを構成しているようです (たとえば、"unittests" という名前のディレクトリと "functionaltests" という名前のディレクトリと "e2etests" という名前のディレクトリがあります)。

具体的には、「テストによって導かれるオブジェクト指向ソフトウェアの成長」で、オークション アプリの TDD 開発を追跡しました。作成者は、何百ものパブリック メソッドを追加することに何の不安もありません。さらに、ある章の後、ダウンロードした「これまでの構造」を調べたところ、テストのディレクトリ構造を完全に変更して、テストのカテゴリに分けていました...

少なくとも過去に、これがジレンマの原因であることに気付いたベテランの TDD 担当者はいますか? もしそうなら、どのように解決しましたか?

実用的な例として、私は Lucene インデックス アプリを開発することで TDD 手法に慣れています。このアプリはドキュメントにインデックスを付け、クエリを実行できるようにします。現時点では、すべてのアプリ クラスが同じパッケージに含まれています。実際に公開する必要mainがある唯一のメソッドは、1 つのクラスにあります。それでももちろん、私は非常に多くのパブリック メソッドを持っています。TDD を使用しているという事実がなければ、それらはすべてパッケージ プライベートである可能性があります。

PS「メソッドの可視性」のタグがないため、「クラスの可視性」を選択しました

後で

「Growing Object-Oriented...」で採用されたアプローチによって、私はかなり不幸な道に導かれたようです.パブリックメソッドの過剰使用は、それがテクニックのデモンストレーションであるという理由だけで使用されたと思われます. ハ。

テストのカテゴリを分割したい場合、この種のアプローチを使用する人はいますか?

\src\unit_tests\java\core\MainTest.java

だけでなく、例えば:
\src\func_tests\java\core\MainTest.java

\src\e2e_tests\java\core\MainTest.java?

4

2 に答える 2

1

テスト対象のパッケージの一部としてテストを実行できるため

これは、テストをメイン クラスと同じディレクトリに配置する必要があるという意味ではありません。別のディレクトリにすることができる同じパッケージに配置する必要があります。

パッケージがあるとしますcom.acme.foo。したがって、ディレクトリ構造は次のようになります。

src
  main
    java
      com
        acme
          foo
            MainClass
  test
    java
      com
        acme
          foo
            MainClassTest

MainClassTestと同じパッケージに含まれMainClassているため、パッケージのプライベートなものにアクセスできます。ただし、これらは別個のディレクトリであるため、結果の JAR には含まれませんMainClassTest

于 2016-12-11T18:47:13.033 に答える
0

Maven を使用しているため、これが Gradle でどのように機能するかはわかりませんが、概念は似ていると思います。したがって、Maven を念頭に置いて説明します。Maven プロジェクトの典型的なセットアップは次のようになります。

ここに画像の説明を入力

プロジェクトのルート レベルには、と がsrcありtargetます。フォルダーtargetには、ビルド プロセス中に作成されたすべてのものが入ります。これはsrc、実際のプロジェクトのソースが含まれていることを意味します。その下srcには、さらに 2 つのディレクトリがあります:maintest. 簡単に言えばmain、最終的に生産的なコードになり、配信されるすべてのものになります。ディレクトリには、ツリーのtestテスト コードが含まれています。main

src/main/javaしたがって、ディレクトリからの同じパッケージ階層も存在することが通常でsrc/test/javaあり、したがって、同じパッケージ定義を持つテスト クラスでは、mainブランチに存在する生産クラスのすべてのメンバーにアクセスできます。

于 2016-12-11T18:51:15.787 に答える