7

テスト/開発の目的で、製品ビルドで削除する必要があるコードに変更を加えることがあります。そのようなブロックをマークして、それらが存在する限り製品ビルドが失敗するか、少なくともビルド中に何らかの形で警告する簡単な方法があるのではないかと思います。

シンプル"//TODO:"は、しばしば忘れられたり、他のたくさんの仕事と混ざり合ったりするため、実際には機能しません。もっと強いものはありますか?

または、外部のtxtファイルを作成して、本番前に何をすべきかについての指示をそこに置くことができたとしても、そのアリはそのファイルが存在するかどうかを確認してからビルドをキャンセルします。

Eclipse/Ant (および Java + Spring) を使用しています。

更新:ローカルと実稼働で異なるコードの大きな塊があるという意味ではありません。実際、すべてのコードは同じであり、同じである必要があります。開発中に多くの時間を節約するためにコードの一部の行をコメントアウトし、その行に沿ってコメントを外すのを忘れるとしましょう。何か注意が必要で、製品ビルドが失敗するか、警告が表示されることをプロジェクトに何らかの形でフラグ付けできるようにしたいだけです。

4

19 に答える 19

13

必要性を避けてください。本番環境に存在してはならないクラスにコードを配置する場合は、別の方法でコードを配置する方法を考えてください。たとえば、フックを提供して、テストコードが必要なことを実行できるようにしますが、テストコードはクラスの外に残します。または、テスト用のサブクラスを使用するか、依存性注入、またはテスト可能でありながらコードを本番環境で有効かつ安全に保つその他の手法を使用します。そのようなテクニックの多くは、MichaelFeathersの素晴らしい本「WorkingEffectivelywithLegacyCode」に詳しく記載されています

于 2009-06-30T18:46:51.227 に答える
12

より強力なタスク コメント マーカーを定義することもできます。Eclipse では FIXME (高優先度) と XXX (通常優先度) が標準であり、さらに多くのタスク タグを定義できます (Eclipse プロパティ -> Java -> コンパイラ -> タスク タグ)。

ビルドを失敗させたい場合は、Ant (1.7) のcontainsファイル セレクターを使用して、指定したテキストを含むファイルを探すことができます。

<target name="fixmeCheck">
  <fail message="Fixmes found">
    <condition>
      <not>
        <resourcecount count="0">
          <fileset dir="${pom.build.sourceDirectory}"
                   includes="**/*.java">
             <contains text="FIXME" casesensitive="yes"/>
          </fileset>
        </resourcecount>
      </not>
    </condition>
  </fail>
</target>

<target name="compile" depends="fixmeCheck">

明らかに、${pom.build.sourceDirectory}ソース ディレクトリにFIXME移動し、検索したいコメントに移動します。

このファイルセットで見つかったファイルをビルドファイルに出力する良い方法を知っている人はいますか (Eclipse をもう一度見るだけではありません)。

于 2009-06-30T18:59:23.340 に答える
7

ブロックが存在する場合に失敗する単体テストを追加します。おそらく、ブロックはCODE_BLOCK_IS_NOT_DELETED = true;単体テストがチェックするグローバル変数を設定します。

ただし、より大きな問題は、本番環境で必要または使用しないコードでテスト/開発することです。それは正しく聞こえません。

于 2009-06-30T18:40:01.567 に答える
3

どういうわけか汚い提案の1つは、静的メソッドでクラスを作成することです

class Prod {
   public static void uction(){
   }
}

次に、必要な場所に印を付けます

Prod.uction();

次に、本番前にクラスを削除するだけで、必要に応じてコンパイラエラーが発生します:D

于 2009-06-30T18:40:37.883 に答える
2

ただし、技術的にこれを解決する場合は、逆の方法で行うことをお勧めします。本番ビルドに特別なことをするのではなく、開発ビルド中に魔法が発生するようにコードとビルド環境を構造化します。本番ビルドは、可能な限り絶対確実(またはマーフィープルーフ)にする必要があります。

開発ビルドで問題が発生した場合:だから何。

本番ビルドで問題が発生すると、さらに問題が発生します。

于 2009-06-30T19:21:36.803 に答える
2

[編集:]C++で動作します...:-)

これらのプリプロセッサ定義を使用すると、すべての問題が解決されます。

#ifdef _DEBUG
#define COMMENT (code)  /* code */
#else
#define COMMENT (code) #error "Commented out code in release!"
#endif

構文が完全に正しいかどうかはわかりませんが、理解できます。

于 2009-06-30T19:21:59.737 に答える
2

ブロックするsubversionにトリガーを追加しました。ビルドを許可する前に、ビルドスクリプトが検索するタグを 設定\\NOCOMMIT: できます。\\NODEPLOY:

于 2009-06-30T21:17:09.163 に答える
1

TDDと依存性逆転の概念がここで役立つかもしれません。さまざまなコードをインターフェイスを実装するクラスに配置することで、そのコードのTestバージョンが実行されるタイミングとprodバージョンが実行されるタイミングを制御できます。

次に、テスト用として明確に名前が付けられたファイルがあり、ビルドから除外できます。

于 2009-06-30T18:43:36.473 に答える
1

上記のすべての提案 (すべての手動の​​がらくたとコードへの粗雑な追加とは何ですか? 自動化の人々...) に加えて、Eclipse、Spring、および ANT を使用していることに気付きました。Eclipse は複数のソース フォルダーをサポートしています。コードを「ソース」フォルダーと「テスト」フォルダーに分け、本番用のものはすべてソース フォルダーに置き、「本番以外」のものはすべてテスト フォルダーに置きます。Spring では、異なる実装を参照する複数の構成を使用できます。したがって、本番環境でのみクラスを参照する本番構成と、テスト コードで実行するテスト構成を使用できます。ANT スクリプトで、アプリの製品版とテスト版をビルドします。テストの場合は「testing」フォルダーをコンパイル パスに追加し、製品版の場合はそのままにしておきます。

于 2009-06-30T19:08:38.360 に答える
1

私が取り組んできたプロジェクトでは、開発中に簡単にテストできるように、さまざまなコードが用意されています。これらを、最終的なブール値をチェックする if ブロックでラップします。ブール値が true の場合、コードにアクセスできます。ブール値が false の場合、最適化として結果の .class ファイルからコードを削除するコンパイラに依存します。例えば:

public class Test {
    public static void main(String[] args) {
        final boolean TESTABLE = true;

        if (TESTABLE) {
            // do something
        }
    }
}

通常、これらの変数は自分で管理し、開発中に使用し、完了したら TESTABLE を false に設定します。開発チームは、TESTABLE などの変数名の規則に簡単に同意することができ、ビルド ファイルの運用ターゲットは、ソース ファイルに TESTABLE variable = true が含まれているかどうかをチェックして失敗する可能性があります。

于 2009-06-30T18:53:22.290 に答える
0

私はこれをできるだけ避けようとします。-別のアプローチは、依存性注入を使用して、テスト用にさまざまな実装を注入することです。

または...

inTestブールフィールドをオブジェクトに追加し、オプションのコードをifステートメントでラップします。

if(inTest) {
testMethod();
}

このvbooleanを依存性注入で設定するか、渡されたシステムプロパティから読み取ることができます(-DinTest = true)

お役に立てれば。

于 2009-06-30T18:44:51.603 に答える
0

Javaプリプロセッサを使用できます。j2meアプリケーションの場合、アンテナプリプロセッサを使用します。コードは次のようになります

public void someMethod() {
    //#ifdef DEBUG
    doDebugStuff();
    //#endif     
}
于 2009-06-30T18:45:16.660 に答える
0

それらのクラス/メソッドを非推奨としてマークすると、コンパイル時にフラグが立てられるでしょうか?

于 2009-06-30T18:38:35.373 に答える
0

Eclipse が表示する //FIXME キーワードを //TODO と共にタスク ビューに使用します (表示内容をフィルターできます)。//FIXME が周りにある場合は、本番環境に出るべきではありません :)

于 2009-06-30T19:06:09.160 に答える
0

私の解決策は、コードの 2 つの別々のブランチで作業することです。デバッグコードなしでクリーンコードのみを取得する1つの本番ブランチと、テスト、デバッグ、新しいストローの試行などのための別のブランチ(これらのいくつかを持っていることもあります)。

Eclipse では、これらは個別のプロジェクト (またはプロジェクトのグループ) です。

Mercurial はこの種の作業に適した VCS ですが、CVS と subversion も優れています。

于 2009-06-30T19:16:54.660 に答える
0

私たちの実稼働環境では、非常に特別なコメントを使用してセクションを削除するための単純な C ツールがいくつかあります。/*#BEGIN_SKIP*//*#END_SKIP*/。標準の C ランタイムに固執すれば、どの環境でもコンパイルできます。

ビルド サイクル全体を変更して、ソース コードを複製し、変換し、コンパイルすることができます。

于 2009-06-30T18:41:08.833 に答える
0

Eclipse では、//TODO 以外のマーカーを使用できます。たとえば、//TOBEREMOVED を追加して優先度を高くすると、他のすべての TODO マーカーよりも前に表示されます。

于 2009-06-30T18:49:33.517 に答える
0

これを解決する明白な方法は、実稼働用のファイルをビルドすることを目的としたビルドでのみ実行される単体テストを用意し (または、現在のビルドが実稼働の対象になっているかどうかを確認し、そうであればテストを実行します)、ビルドに失敗することです。テストが失敗した場合。

あなたは決して忘れません。どのようなテストかというと、コードが何をするかを実際にチェックするのが理想的です。これが不可能な場合は、Terry Lorber が提案したグローバル スタティックの方が、現在のものよりもはるかに優れています。

于 2009-06-30T18:49:42.580 に答える
0

//TODO: をいくつか追加するだけです。 -- 次に、コード内で //TODO を検索して表示する ac# スクリプト (cs-script.net) を作成します。その後、このスクリプトを自動ビルドに追加できます (そうしている場合)。これにより、ビルドを実行するたびに、何をすべきかを確認できます。デプロイする前に、コードの todo リストを確認してください。

独自のスクリプトを作成する代わりに、 vstudioをいくつかのツールと統合して、todo ラインも指摘する方法についての説明があります。-studion-2005-c.html

ただし、正規表現を使用して単純な C# スクリプトを作成するよりも、そのツールをセットアップする方が面倒だと私には思えます。

于 2009-06-30T18:50:44.807 に答える