2009-03-20 2 views
6

Я ищу, чтобы запутать наш код веб-приложения Java в нашем существующем скрипте сборки Ant, но я столкнулся с проблемами вокруг модульного тестирования. Я запутываю код сразу после его компиляции, прежде чем он будет запущен и до того, как будут запущены модульные тесты.Можете ли вы тестировать модулированный код?

Однако, если я запутываю свой производственный код, а не мой тестовый код, все мои тесты терпят неудачу, потому что они пытаются вызывать методы, которые больше не существуют, потому что они были переименованы в обфускатор. Я могу отметить некоторые методы, чтобы не запутывать, чтобы их можно было использовать внешними системами, такими как наш набор тестов, но поскольку мы стреляем для высокоуровневого тестирования, нам нужно отметить все наших методов как un-obfuscatable.

Если я запутать тестовые классы, а также, я бегу на две проблемы:

1: производственные классы и тестовые классы сливаются в тот же каталог, выходной и я не могу исключить тестовые классы от производство .jar файлы

2: Я не могу запустить мой нормальный Ant batchtest вызова:

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

потому что обфускатор изменил название тестов.

Я мог бы просто запустить obfuscator в результирующих файлах .war/.ear, но я хочу, чтобы наши модульные тесты выполнялись с измененным кодом, чтобы выкачать любые ошибки, вызванные обфускатором.

В настоящее время я работаю с Zelix KlassMaster, но я все еще на этапе оценки, поэтому буду открыт для других вариантов, если они будут работать лучше.

ответ

3

Может ли вы сказать ему, чтобы запустить обфускатор таким образом, чтобы он эффективно refactors кода включая ссылки из тестов (то есть, когда изменения имени производства, проверочный код, меняет свою ссылку), но не запутать сами тесты (т.е. не менять имена тестовых классов или их методы)? Учитывая предыдущий опыт работы с обфускаторами, я ожидаю, что это сработает.

Так, например, предположим, что мы имели unobfuscated источник:

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

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

Вы хотите, чтобы установить параметры на обфускатора, чтобы сделать его эффективно:

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

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

Таким образом, ваш «пробег тесты «Задачи Ant должны быть в состоянии оставаться неизменными, потому что API тестов не изменился - просто реализация методов.

+0

Я нашел способ в KlassMaster, чтобы сделать это, добавив «exclude *. * Test;» в моем сценарии, и они теперь работают. Поскольку я все еще должен запускать тесты через обфускатор, они все еще заканчиваются смешанными с производственными классами в выходном каталоге. Я проверяю параметры конфигурации для этого –

0

Обфускатор не должен менять общедоступные вызовы. Кажется, что yo должен запускать другие тесты перед обфускацией, потому что они проверяют внутреннюю функциональность, которая не должна меняться после обфускации.

Так что, если это так, почему бы просто не запустить тесты, которые вызывают общедоступность? Все, что вам нужно сделать, это иметь отдельный класс с этими вызовами и перестроить его с помощью запущенного кода, а затем запустить эту DLL.

+1

Хотя у нас есть «общедоступные» методы, у нас нет методов внешней обработки. Я думаю, что мы должны запутывать общедоступные общедоступные методы, как и частные методы. Я хотел бы протестировать все после обфускации, потому что есть ошибки, которые он может ввести, особенно вокруг отражения. –

+0

@ Nathan Voxland Я считаю, что эта функциональность также должна быть проверена через публичный API, другими словами, неважно, как вы это делаете, только то, что она работает –

+0

@Nathan - рассмотрите возможность использования dp4j.com, он будет вводить отражение API, необходимый для тестирования частных методов во время компиляции. Таким образом, obfuscator должен запутывать ваш простой доступ к открытым Java-средствам в тестах, а затем dp4j будет отражать запутанные обращения. NB: это работает только тогда, когда вы знаете во время компиляции методы, которые хотите отразить, т. Е. В вашем случае. – simpatico

7

Я использую yguard (это бесплатно, поэтому я упоминаю об этом).

Вы должны быть в состоянии сказать обфускатору, чтобы не запутывать определенные вещи (смотри here, похоже, вы можете).

Некоторые, как говорили другие, не обфускают тесты, а путают все остальное.

Однако, я хотел бы предложить вам сделать следующее:

  1. компилировать
  2. Jar ООН-затемненные файлы (при желании)
  3. теста-ООН затемненных файлы
  4. , если они проходят тесты затем запутать банку в затемненных файлах
  5. теста на затемненные файлах

Это будет медленнее, но если тесты не пройдут на шаге 3, их будет легче исправить (потенциально), и если тесты завершится с ошибкой в ​​5, то вы знаете, что есть проблема с запутанием, а не с исходным кодом.

+0

Хорошая точка с двухпроходным тестированием. –

+0

Спасибо за ссылку yGuard. –

Смежные вопросы