2009-03-20 8 views
6

私は、既存のAntビルドスクリプトでJava Webアプリケーションコードを難読化しようとしていますが、単体テストに関する問題が発生しています。私はコードがコンパイルされた直後、jar-edされる前、そしてユニットテストが実行される前にコードを難読化しています。ユニットテスト難読化コードはありますか?

しかし、私がテストコードではなく私の生産コードをわかりにくくすると、obfuscatorによって名前が変更されたので、もはや存在しないメソッドを呼び出そうとしているので、すべてのテストは失敗します。特定のメソッドを難読化して、テストスイートなどの外部システムで使用できるようにすることができますが、単体テストの範囲を広げるためにはすべてのを難読化不可能としてマークする必要があります。

私もテストクラスを難読化した場合、私は2つの問題に実行:

1:生産クラスとテストクラスが同じ出力ディレクトリにマージされますと、私はからテストクラスを除外することができません生産.jarファイル

2:難読化ツールは、テストの名前が変更されたため

<batchtest todir="${basedir}/reports"> 
     <fileset dir="${basedir}/components/common/build-zkm"> 
      <include name="**/*Test.class"/> 
     </fileset> 
</batchtest> 

:私は私の通常のAntのbatchtestコールを実行することはできません。

結果の.war/.earファイルでobfuscatorを実行するだけで済みますが、難読化ツールによって発生したバグを排除するために、変更されたコードに対してユニットテストを実行したいと考えています。

私は現在Zelix KlassMasterと一緒に作業していますが、私はまだ評価段階にありますので、うまく動作するには他のオプションも利用できます。

答えて

3

あなたは(すなわち、生産名前の変更は、テストコードは、その参照を変更した場合)、それが効果的にテストからの参照を含むコードをリファクタリングするように、難読化ツールを実行するためにそれを伝えることができますが(テスト自分自身を難読化しませんつまり、テストクラスまたはそのメソッドの名前を変更しないでください)。私がobfuscatorsで以前の経験を与えられたら、私はそれが働くことを期待していました。

public class Xyzzy 
{ 
    public void ababa() {} 
} 

public class ProductionCodeTest 
{ 
    public void testProductionMethod() 
    { 
     new Xyzzy(). ababa(); 
    } 
} 

そのように、あなたの「ファイル名を指定して実行:あなたはそれが効果的に作るために難読化ツールのオプションを設定したい

public class ProductionCode 
{ 
    public void productionMethod() {} 
} 

public class ProductionCodeTest 
{ 
    public void testProductionMethod() 
    { 
     new ProductionCode().productionMethod(); 
    } 
} 

だから例えば、我々は難読化されていないソースを持っていたと仮定しますテストのAPIは変更されていないため、テストの "Antタスクは同じままでなければなりません。単にメソッドの実装です。

+0

私はKlassMasterで "exclude *。* Test;"を追加することでこれを行う方法を見つけました。私のスクリプトでは、彼らは今実行されます。 obfuscatorを使ってテストを実行する必要があるので、出力ディレクトリのプロダクションクラスと混ざり合っています。私はそのための設定オプションを確認しています –

0

難読化者はあなたの公衆電話を変更すべきではありません。難読化の前に他のテストを実行するべきかどうかは、難読化後に変更すべきでない内部機能をチェックするためです。

そのような場合は、パブリック機能を呼び出すテストを実行するだけではどうですか。あなたがする必要があるのは、これらの呼び出しとは別のクラスを持ち、難読化されたコードを使って再構築し、そのDLLを実行することだけです。

+1

私たちは "public"メソッドを持っていますが、外部に面するメソッドはありません。私は、私たちが私的な方法と同じように、内部のみの公開方法を難読化するべきだと私は思う。特に難読化のために導入できるバグがあるので、難読化後のすべてをテストしたいと思います。 –

+0

@Nathan Voxland私は、その機能は公開APIを介してテストする必要があると考えています。つまり、どのように動作するかは関係ありません。 –

+0

@Nathan - dp4j.comの使用を検討してください。コンパイル時にプライベートメソッドをテストするために必要なAPI。したがって、obfuscatorは、テストでプレーンなjava privateメソッドへのアクセスを難読化する必要があります。そして、dp4jは難読化されたアクセスを反映します。注:これは、コンパイル時に、あなたが反映したいメソッド、つまりあなたのケースを知っている場合にのみ機能します。 – simpatico

7

私はyguardを使用しています(無料ですので、私はそれを言います)。

obfuscatorに特定のことを難読化しないように指示する必要があります(hereと思われます)。

他の人が言っているように、テストを難読化するのではなく、残りの部分を難読化してください。 (必要であれば)、彼らが渡した場合

  • 瓶に
  • テスト非難読化されたファイルをアン難読化されたファイルをコンパイル

    1. しかし、私はあなたが次の操作を行うことを示唆していますテストはその後、難読化されたファイル難読化されたファイル

    2. テストをjarファイルを難読化

    これは遅くなりますが、手順3でテストが失敗した場合は(潜在的に)修正するのが簡単になり、テストが5で失敗した場合、ソースコードではなく難読化に問題があることがわかります。

  • +0

    2パステストの良い点。 –

    +0

    yGuardリンクをありがとう。 –

    関連する問題