2010-08-03 13 views
8

के साथ ग्राफिक्स पीढ़ी का परीक्षण मैं ग्राफ के ग्राफिकल प्रतिनिधित्व उत्पन्न करने के लिए जावा के ग्राफिक्स 2 डी का उपयोग कर रहा हूं। मैं एक पीएनजी फ़ाइल लिखने के लिए ImageIO का भी उपयोग कर रहा हूं। (ImageIO.write(image, "png", out);)जुनीट

मुझे आश्चर्य है कि जेनिट परीक्षणों को मैं यह जांचने के लिए कैसे लिखूं कि जेनरेट किए गए ग्राफिक्स की अपेक्षा की जाती है या नहीं। मैं पीएनजी फाइलों को प्री-जेनरेट कर सकता था लेकिन अगर एक अलग मशीन पर फ़ॉन्ट थोड़ा अलग है तो क्या होगा?

+2

अच्छा, आप निश्चित रूप से क्या देखना चाहते हैं? –

+0

अच्छा सवाल :-) अब, जैसा कि मैं इसके बारे में सोचता हूं, शायद यह जांचना महत्वपूर्ण नहीं है कि छवि बिल्कुल अपेक्षित है या नहीं, लेकिन कुछ अपेक्षित विशेषताएं मौजूद हैं या नहीं। – PeWu

उत्तर

1

आप उत्पादन उदा .:

  • वहाँ यह (100,100) पर एक सफेद पिक्सेल के विशिष्ट, जाना जाता सुविधाओं के लिए परीक्षण की कोशिश कर सकते?
  • यह सीमा पूरी तरह से काला है?
  • क्या छवि अपेक्षित आकार है?

और/या आप कुछ "कुल गुण" है कि परिणामों में कुछ fuzziness के लिए अनुमति देने के लिए परीक्षण लिख सकते हैं:

  • छवि कम से कम 90% मैच संदर्भ छवि है? (विभिन्न फ़ॉन्ट्स, एंटीअलाइजिंग मतभेद इत्यादि के लिए अनुमति देने के लिए)
  • पृष्ठभूमि रंग के बराबर छवि में सबसे आम रंग है?
+0

धन्यवाद। यह बिटमैप पिक्सल की बजाय कुछ विशेषताओं का परीक्षण करने के लिए एक अच्छा विचार है। जैसा कि विनीत ने देखा, एंटीअलाइजिंग में भी अंतर हो सकता है। – PeWu

1

आप एक सरणी में उत्पन्न छवियों के सभी आरजीबी मूल्यों पढ़ सकते हैं और एक पहले से बनाई गई छवि का प्रतिनिधित्व करता है, तो आप पूरी छवि के बारे में वास्तव में विशिष्ट हैं एक के खिलाफ है कि 2 डी सरणी तुलना सकता है।

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

private void compareRasterImages(BufferedImage expectedPngIo, BufferedImage actualPngIo) throws AssertionError { 
    int minX = expectedPngIo.getMinX(); 
    int minY = expectedPngIo.getMinY(); 
    int maxX = expectedPngIo.getMinX() + expectedPngIo.getWidth(); 
    int maxY = expectedPngIo.getMinY()+ expectedPngIo.getHeight(); 

    assertEquals(minX, actualPngIo.getMinX()); 
    assertEquals(minY, actualPngIo.getMinY()); 
    assertEquals(expectedPngIo.getHeight(), actualPngIo.getHeight()); 
    assertEquals(expectedPngIo.getWidth(), actualPngIo.getWidth()); 
    for (int x_i = minX; x_i < maxX; x_i++){ 
     for (int y_i = minY; y_i < maxY; y_i++) { 
      assertEquals(expectedPngIo.getRGB(x_i, y_i), actualPngIo.getRGB(x_i, y_i)); 
     } 
    } 
} 

मैं अपने पीएनजी से BufferedImage पुनः प्राप्त (के रूप में बाइट []) का उपयोग कर ImageIO:

BufferedImage expectedPngIo = ImageIO.read(new ByteArrayInputStream(expectedPng)); 
enter code here 
+0

आप इकाई परीक्षण में एक फ़ॉन्ट फ़ाइल की आपूर्ति कर सकते हैं, और परीक्षण के लिए एंटी-एलियासिंग अक्षम कर सकते हैं। मेरे अनुभव में यह समान परिणाम भी क्रॉस प्लेटफ़ॉर्म उत्पन्न करता है। – The111

2

मेरे लिए, यह ठोस कार्यान्वयन काम करने के लिए लगता है एक स्थिर छवि पर टेक्स्ट ओवरलाइड जैसे साधारण चीजों के पिक्सेल सही ग्राफिक्स यूनिट परीक्षणों के लिए रेंडर समान क्रॉस-प्लेटफॉर्म को प्रस्तुत करने में प्रभावी हो।

  1. Font और FontRenderContext वर्ग फोंट प्रतिपादन में सम्मिलित करें, तो वे परीक्षण के अंतर्गत नियंत्रित किया जा सकता।
  2. इकाई परीक्षण में एक .ttf फ़ाइल की आपूर्ति करें और फ़ाइल से फ़ॉन्ट उत्पन्न करने के लिए Font.createFont() का उपयोग करें।
  3. यूनिट परीक्षण में, FontRenderContext में एंटी-एलाइजिंग अक्षम करें। यदि आप इस चरण को छोड़ देते हैं, तो परिणाम ऐसा लगता है कि क्रॉस प्लेटफ़ॉर्म अलग-अलग होता है।

मैं अगर दूसरों लगता है कि यह भंगुर या विफलता की आशंका वाले किसी भी कारण से है उत्सुक हूँ, लेकिन मैं इसके साथ अच्छे परिणाम मिला है अब तक।

1

मैं करने के लिए इस पाया है