5

それ自体にいくつかのSystem.out.printコマンドがあるレガシーコードを使用しています。私の eCobertura プラグインはこの行を赤く表示するので、単体テストを行いたいと思います。

ここstackoverflowで、非常に興味深いコンソール出力を単体テストする方法を見つけました。

これは私がそれを行う方法です:

        private final ByteArrayOutputStream outContent = new ByteArrayOutputStream();

        @Before
        public void setUpStreams() {
            System.setOut(new PrintStream(outContent));
        }

        @After
        public void cleanUpStreams() {
            System.setOut(null);
        }

        @Test
        public void out() {
            System.out.print("Some message from the system");
            assertEquals("Some message from the system", outContent.toString());
        }

これまでのところ、テストは成功していますが、コード カバレッジ プラグインを再度実行すると、次のメッセージが表示されます。

スレッド「Thread-0」での例外 net.sourceforge.cobertura.coveragedata.TouchCollector.applyTouchesOnProjectData(TouchCollector.java:186) の java.lang.NullPointerException net.sourceforge.cobertura.coveragedata.ProjectData.saveGlobalProjectData(ProjectData.java:267) ) net.sourceforge.cobertura.coveragedata.SaveTimer.run(SaveTimer.java:31) で java.lang.Thread.run(Thread.java:662) で

私はいくつか疑問があります:

  • 単体テストを試みるのは正しいSystem.out.print()'sですか?
  • eCoberturain はこのタイプのテストに対応していますか?
  • eCobertura がこのタイプのテストに対応していない場合、なぜ赤い線が表示されるのですか?
  • 私のテストに何か問題がありますか?
  • 私はjUnit 4.11を使用していますが、これは何か関係があると思いますか?
  • eCobertura でこのエラーが表示されるのはなぜですか?
4

2 に答える 2

6

System.out.print()の単体テストを試みるのは正しいですか?

これは、テストしようとしているものに大きく依存します。System.out.print()自体をテストする必要はないと思います。Sun/Oracleがこれを十分に行っていることを願っています。ただし、アプリケーションが重要な情報をコンソールに出力し、これが出力を検証する唯一の方法である場合は、はいよりもテストする必要があります。対応するクラスをテストしてコードをテストできる場合は、おそらく出力ストリーム自体をテストする必要はありません。

たとえば、データベースを見てください。私はJDBCドライバー自体をテストしていませんが、データベースとの間のデータのロード/保存の一部であるすべてのコード/機能をテストしています。

赤い線は、コード行が実行されなかったことを意味するだけです。これは問題ない場合もあれば、テストがコードの一部に触れていないことを意味している場合もあります。テストカバレッジを高くすることは重要ですが、100%を目指すことは必ずしも必要ではないかもしれません(パレートの法則を考えてください)

NullPointerExceptionについて

System.outをnullに設定するための呼び出しとSystem.setOut(null);、eCoberturaは、おそらく現在nullであるStandardOutに何かを書き込もうとします。次のコードでStdOutを使用できるようにするには、元のOut Streamを@Beforeメソッドに保存し、@Afterメソッドで復元する必要がある場合があります。

eCoberturaはこのタイプのテストと互換性がありませんか?

eCoberturaがこのタイプのテストと互換性がない場合、なぜ赤い線が表示されるのですか?

eCoberturaでこのエラーが発生するのはなぜですか?

eclipseとeCoberturaの間の通信は、Standard Outを介して行われる可能性がありますが、よくわかりません。この場合、Standard Outをリダイレクトする場合よりも、出力だけでなくCoberturaからの出力もリダイレクトされ、GUIは実行されたものと実行されなかったものを認識しなくなり、赤色になります。

私のテストに何か問題がありますか?

StdOutが正しく復元されていることを確認する必要がある場合があります。

私はjUnit4.11を使用していますが、これはそれと関係があると思いますか?

いいえ、そうは思いません

于 2013-03-02T14:05:42.470 に答える
3

コードで System.out.println を使用するのが正しい場合は、それらを (ユニット/統合) テストするのが正しいです。

この種のコードをテストするためのシステム ルールと呼ばれる便利なシステム テスト ユーティリティがあります。

http://stefanbirkner.github.com/system-rules/

于 2013-03-02T13:56:37.100 に答える