2009-03-20 16 views
6

मैं अपने मौजूदा चींटी निर्माण स्क्रिप्ट के भीतर हमारे जावा वेब अनुप्रयोग कोड अंधेरा करने के लिए देख रहा हूँ, लेकिन इकाई परीक्षण के आसपास समस्याओं में चल रहा हूँ। मैं संकलित होने के ठीक बाद कोड को खराब कर रहा हूं, इससे पहले कि यह जार-एड है और यूनिट परीक्षण चलाने से पहले।क्या आप यूनिट टेस्ट ओबस्कस्केटेड कोड कर सकते हैं?

हालांकि, अगर मैं अपने उत्पादन कोड को रोकता हूं और मेरा टेस्ट कोड नहीं करता हूं, तो मेरे सभी परीक्षण विफल हो जाते हैं क्योंकि वे उन विधियों को कॉल करने का प्रयास कर रहे हैं जो अब मौजूद नहीं हैं क्योंकि उनका नाम बदलकर ओबफ्यूसेटर द्वारा किया गया है। मैं कुछ तरीकों को चिह्नित इतना अस्पष्ट कर करने के लिए वे इस तरह के हमारे परीक्षण सुइट के रूप में बाहरी सिस्टम द्वारा इस्तेमाल किया जा सकता कर सकते हैं, लेकिन हम उच्च इकाई परीक्षण कवरेज के लिए शूटिंग कर रहे हैं क्योंकि हम सभी अन-obfuscatable के रूप में हमारे विधियों में से चिह्नित करने के लिए की आवश्यकता होगी।

1:

अगर मैं रूप में अच्छी तरह परीक्षण कक्षाओं अंधेरा करना, मैं दो समस्याएं आ उत्पादन वर्गों और परीक्षण कक्षाएं एक ही आउटपुट निर्देशिका में विलय हो और मैं से परीक्षण वर्गों को बाहर करने में असमर्थ हूँ उत्पादन .jar फ़ाइलें

2: मैं अपने सामान्य चींटी batchtest कॉल नहीं चल सकता:

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

क्योंकि अस्पष्टकर्ता परीक्षण के नाम बदल गया है।

मैं परिणामस्वरूप .war/.ear फ़ाइलों पर केवल obfuscator चला सकता हूं, लेकिन मैं obfuscator के कारण किसी भी बग को चलाने के लिए संशोधित कोड के खिलाफ हमारे यूनिट परीक्षण चलाने के लिए चाहता हूं।

मैं वर्तमान में Zelix KlassMaster साथ काम कर रहा हूँ, लेकिन मैं मूल्यांकन चरण में अभी भी कर रहा हूँ तो मैं अन्य विकल्पों के लिए खुला हो सकता है अगर वे बेहतर काम करेगा।

उत्तर

3

आप अस्पष्टकर्ता ऐसी है कि वह प्रभावी रूप से परीक्षण से संदर्भ सहित कोड refactors चलाने के लिए (यानी एक उत्पादन नाम परिवर्तन, परीक्षण कोड अपने संदर्भ बदल जाता है जब) यह बता सकते हैं, लेकिन परीक्षण के लिए खुद को छिपाने की नहीं (यानी परीक्षण कक्षाओं या उनके तरीकों के नाम नहीं बदलते हैं)? 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(); 
    } 
} 

आप इसे प्रभावी ढंग सेबनाने के लिए अस्पष्टकर्ता का विकल्प सेट करना चाहते परीक्षण "चींटी कार्यों को वही रहने में सक्षम होना चाहिए, क्योंकि परीक्षणों का एपीआई नहीं बदला है - केवल विधियों के कार्यान्वयन।

+0

मुझे क्लासमास्टर में "बहिष्कृत * * * टेस्ट;" जोड़कर ऐसा करने का कोई तरीका मिला। मेरी लिपि में और अब वे दौड़ते हैं। चूंकि मुझे अभी भी obfuscator के माध्यम से परीक्षण चलाने के लिए है, वे अभी भी आउटपुट निर्देशिका में उत्पादन कक्षाओं के साथ मिश्रित अंत कर रहे हैं। मैं उस –

0

अस्पष्टकर्ता अपने सार्वजनिक कॉल परिवर्तन नहीं होना चाहिए। ऐसा लगता है कि आपको अन्य परीक्षणों को obfuscation से पहले चलाना चाहिए क्योंकि वे आंतरिक कार्यक्षमता की जांच करते हैं जो obfuscation के बाद नहीं बदला जाना चाहिए।

तो यदि यह मामला है, क्यों नहीं बस परीक्षण है कि सार्वजनिक कॉल कार्यपद्धति चला सकता हूँ? तुम सब करने की ज़रूरत है उन कॉल के साथ एक अलग वर्ग है और यह समझ से परे कोड का उपयोग कर फिर से निर्माण और उसके बाद कि dll चलाया जाता है।

+1

के लिए कॉन्फ़िगरेशन विकल्पों की जांच कर रहा हूं, जबकि हमारे पास "सार्वजनिक" विधियां हैं, हमारे पास बाहरी रूप से विधियों का सामना नहीं करना है। मुझे लगता है कि हमें केवल आंतरिक तरीकों की तरह आंतरिक-केवल सार्वजनिक तरीकों को खराब करना चाहिए। मैं पोस्ट-ओबफ्यूशन के बाद सबकुछ जांचना चाहता हूं क्योंकि इसमें बग्स हैं जो इसे पेश कर सकते हैं, खासकर प्रतिबिंब के आसपास। –

+0

@ नेथन वॉक्सलैंड मेरा मानना ​​है कि उस कार्यक्षमता को सार्वजनिक एपीआई के माध्यम से भी परीक्षण किया जाना चाहिए - दूसरे शब्दों में इससे कोई फर्क नहीं पड़ता कि आप यह कैसे करते हैं कि यह –

+0

@Nathan - dp4j.com का उपयोग करने पर विचार करें, यह प्रतिबिंब इंजेक्ट करेगा एपीआई संकलन समय पर निजी तरीकों का परीक्षण करने के लिए आवश्यक है। तो obfuscator परीक्षण में अपने सादे जावा निजी तरीकों का उपयोग obfuscate करना चाहिए, और फिर dp4j obfuscated उपयोग को प्रतिबिंबित करेगा। एनबी: यह केवल तभी काम करता है जब आप संकलित समय पर उन तरीकों को जानते हैं जिन्हें आप प्रतिबिंबित करना चाहते हैं, यानी आपके मामले में। – simpatico

7

मैं yguard का उपयोग करता हूं (यह मुफ़्त है, इसलिए मैं इसका उल्लेख करता हूं)।

आपको कुछ चीजों को खराब करने के लिए obfuscator को बताने में सक्षम होना चाहिए (here देखकर ऐसा लगता है कि आप कर सकते हैं)।

कुछ लोगों ने कहा है, परीक्षणों को खराब न करें, लेकिन शेष को खराब करें।

हालांकि, मैं सुझाव है कि आप निम्न कार्य करें:

  1. संकलन
  2. जार अन-समझ से परे फ़ाइलें (आवश्यक होने पर)
  3. परीक्षण अन-समझ से परे फ़ाइलों
  4. अगर वे पारित परीक्षण तो जार अंधेरा सुलझा फ़ाइलों
  5. परीक्षण सुलझा फ़ाइलों

यह धीमा हो जाएगा, लेकिन यदि परीक्षण चरण 3 में विफल हो जाते हैं तो यह संभवतः (संभावित रूप से) को ठीक करना आसान होगा और यदि परीक्षण 5 पर विफल हो जाते हैं तो आपको पता है कि obfuscation के साथ कोई समस्या नहीं है आपका स्रोत कोड।

+0

दो-पास परीक्षण के साथ अच्छा बिंदु। –

+0

yguard लिंक के लिए धन्यवाद। –

संबंधित मुद्दे