QGIS प्लगइन्स के लिए स्वचालित परीक्षण लिखना?


16

मैं पायथन में लिखे QGIS प्लगइन्स के लिए स्वत: परीक्षण लिखने के बारे में सलाह ले रहा हूँ।

मैंने पहले PyUnit ( unittestमॉड्यूल) का उपयोग करके पायथन स्क्रिप्ट के लिए परीक्षण लिखे हैं , लेकिन किसी GUI के साथ आवेदन के लिए ऐसा कभी नहीं किया है। मुझे एक पेज मिला है जिसमें बताया गया है कि Qt विगेट्स ( http://www.voom.net/pyqt-qtest-example ) पर यूनिट टेस्ट करने के लिए PyQt4.QTest का उपयोग कैसे करें , लेकिन मैं यह देखने के लिए संघर्ष कर रहा हूं कि मैं इसका उपयोग कैसे कर सकता हूं एक विजेट के साथ जिसे QGIS के भीतर से चलाने के लिए डिज़ाइन किया गया है।

PyQGIS प्रलेखन में "परीक्षण" पर खंड विशेष रूप से अनुपस्थित है।

मेरे पास अब तक क्या है:

  • पृथक मॉड्यूल या फ़ंक्शन में डेटा की वास्तविक प्रसंस्करण रखें, और उन लोगों के लिए यूनिट परीक्षण लिखें;
  • क्यूटेस्ट का उपयोग करके यूआई का बुनियादी परीक्षण करें;
  • प्रार्थना करें कि QGIS के भीतर से प्लगइन का उपयोग करते समय यह सब एक साथ रहता है।

क्या कोई बेहतर तरीका है?

जवाबों:


11

QGIS प्लगइन्स के परीक्षण की क्षमताएँ (विशेषकर एकीकरण परीक्षण का प्रश्न, QGIS वातावरण में, ओपी हाइलाइट्स के रूप में) ने हाल ही में बहुत सुधार किया है। इसलिए मुझे उम्मीद है कि यह अपडेट समकालीन पाठकों, साथ ही साथ ओपी को भी मदद करेगा।

असीम ने जुलाई 2016 में QGIS प्लगइन्स के परीक्षण को स्वचालित करने के बारे में किसी के लिए भी ज़रूरी लेख प्रकाशित किया था; अजगर प्लगइन्स के लिए QGIS निरंतर एकीकरण परीक्षण पर्यावरण । यह उनके द्वारा उपयोग किए जाने वाले दृष्टिकोण और उपकरणों का वर्णन करता है - जिनमें से सभी खुले स्रोत हैं। प्रमुख पहलू हैं: -

  • उनके विशेष QGIS प्लगइन परीक्षक जो QGIS वातावरण के अंदर परीक्षणों को स्वचालित कर सकते हैं
  • डॉकटर क्यूजीआईएस छवियों का उपयोग , कंटेनर-बेस वातावरण में विभिन्न क्यूजीआईएस संस्करणों / कॉन्फ़िगरेशन के खिलाफ परीक्षण की अनुमति देता है
  • एक विशेष डॉकटर QGIS चित्र , जिसका उपयोग स्वयं QGIS के परीक्षण के लिए किया जाता है, लेकिन जो - इन्वोकेशन द्वारा qgis_testrunner.shएक प्लगइन पर यूनिट टेस्ट चलाने के लिए इस्तेमाल किया जा सकता है
  • निरंतर एकीकरण के लिए ट्रैविस सीआई का उपयोग - यानी पूर्ण परीक्षण सूट हर नए कोड के साथ चलाया जाता है

यदि आप ट्रैविस सीआई / डॉक से परिचित हैं तो इसे स्थापित करना अपेक्षाकृत आसान होना चाहिए। वे निम्नलिखित 4 चरणों का वर्णन करते हैं और इस तरह से स्थापित किए गए अपने स्वयं के प्लगइन्स के 2 उदाहरण प्रदान करते हैं।

  1. QGIS परीक्षण वातावरण के साथ Docker छवि खींचें और इसे चलाएं
  2. प्लगइन स्थापित करने और परीक्षण धावक के लिए QGIS तैयार करने के लिए qgis_setup.sh NameOfYourPlugin चलाएँ।
  3. वैकल्पिक रूप से अपने प्लगइन के निर्माण के लिए आवश्यक सभी कार्यों को पूरा करें
  4. डॉकर को अंदर लाने वाले परीक्षण धावक को चलाएं qgis_testrunner.sh

आपने सबसे अच्छा अभ्यास करने के लिए कहा और आज के रूप में मैं निश्चित रूप से इस पर विचार करूंगा। QGIS डॉक्स अभी भी प्लगइन परीक्षण पर एक समर्पित खंड नहीं है (मुझे उम्मीद है कि यह शीघ्र ही बदल जाएगा) लेकिन "प्रार्थना करें कि यह सब एक साथ रहे" दृष्टिकोण निश्चित रूप से अब एकमात्र विकल्प नहीं है।


4
असीम अब और नहीं है। क्या किसी ने उस सामग्री को सहेजा है?
पेड्रो कैमार्गो

8

ऐसा लगता है कि unittestएक पायथन पायथन एप्लिकेशन में लोड किए गए पायथन प्लगइन्स का परीक्षण करना संभव है ।

qgis.core.iface स्टैंडअलोन अनुप्रयोगों से उपलब्ध नहीं है, इसलिए मैंने एक डमी उदाहरण लिखा है जो एक फ़ंक्शन देता है जो इसे दिए गए किसी भी तर्क को स्वीकार करेगा और कुछ भी नहीं करेगा। इसका मतलब यह है कि कॉल की तरह self.iface.addToolBarIcon(self.action)त्रुटियों को फेंक नहीं है।

नीचे दिया गया उदाहरण एक प्लगइन को लोड करता है myplugin, जिसमें कुछ परत नीचे मेनू होते हैं, जिसमें परत परत रजिस्ट्री से लिया गया नाम होता है। परीक्षण यह देखने के लिए जांचते हैं कि क्या मेनू सही तरीके से आबाद हुए हैं, और उनके साथ बातचीत की जा सकती है। मुझे यकीन नहीं है कि यह प्लगइन लोड करने का सबसे अच्छा तरीका है, लेकिन यह काम करने लगता है।

myplugin विजेट

#!/usr/bin/env python

import unittest

import os
import sys

# configure python to play nicely with qgis
osgeo4w_root = r'C:/OSGeo4W'
os.environ['PATH'] = '{}/bin{}{}'.format(osgeo4w_root, os.pathsep, os.environ['PATH'])
sys.path.insert(0, '{}/apps/qgis/python'.format(osgeo4w_root))
sys.path.insert(1, '{}/apps/python27/lib/site-packages'.format(osgeo4w_root))

# import Qt
from PyQt4 import QtCore, QtGui, QtTest
from PyQt4.QtCore import Qt

# import PyQGIS
from qgis.core import *
from qgis.gui import *

# disable debug messages
os.environ['QGIS_DEBUG'] = '-1'

def setUpModule():
    # load qgis providers
    QgsApplication.setPrefixPath('{}/apps/qgis'.format(osgeo4w_root), True)
    QgsApplication.initQgis()

    globals()['shapefile_path'] = 'D:/MasterMap.shp'

# FIXME: this seems to throw errors
#def tearDownModule():
#    QgsApplication.exitQgis()

# dummy instance to replace qgis.utils.iface
class QgisInterfaceDummy(object):
    def __getattr__(self, name):
        # return an function that accepts any arguments and does nothing
        def dummy(*args, **kwargs):
            return None
        return dummy

class ExamplePluginTest(unittest.TestCase):
    def setUp(self):
        # create a new application instance
        self.app = app = QtGui.QApplication(sys.argv)

        # create a map canvas widget
        self.canvas = canvas = QgsMapCanvas()
        canvas.setCanvasColor(QtGui.QColor('white'))
        canvas.enableAntiAliasing(True)

        # load a shapefile
        layer = QgsVectorLayer(shapefile_path, 'MasterMap', 'ogr')

        # add the layer to the canvas and zoom to it
        QgsMapLayerRegistry.instance().addMapLayer(layer)
        canvas.setLayerSet([QgsMapCanvasLayer(layer)])
        canvas.setExtent(layer.extent())

        # display the map canvas widget
        #canvas.show()

        iface = QgisInterfaceDummy()

        # import the plugin to be tested
        import myplugin
        self.plugin = myplugin.classFactory(iface)
        self.plugin.initGui()
        self.dlg = self.plugin.dlg
        #self.dlg.show()

    def test_populated(self):
        '''Are the combo boxes populated correctly?'''
        self.assertEqual(self.dlg.ui.comboBox_raster.currentText(), '')
        self.assertEqual(self.dlg.ui.comboBox_vector.currentText(), 'MasterMap')
        self.assertEqual(self.dlg.ui.comboBox_all1.currentText(), '')
        self.dlg.ui.comboBox_all1.setCurrentIndex(1)
        self.assertEqual(self.dlg.ui.comboBox_all1.currentText(), 'MasterMap')

    def test_dlg_name(self):
        self.assertEqual(self.dlg.windowTitle(), 'Testing')

    def test_click_widget(self):
        '''The OK button should close the dialog'''
        self.dlg.show()
        self.assertEqual(self.dlg.isVisible(), True)
        okWidget = self.dlg.ui.buttonBox.button(self.dlg.ui.buttonBox.Ok)
        QtTest.QTest.mouseClick(okWidget, Qt.LeftButton)
        self.assertEqual(self.dlg.isVisible(), False)

    def tearDown(self):
        self.plugin.unload()
        del(self.plugin)
        del(self.app) # do not forget this

if __name__ == "__main__":
    unittest.main()

4
मैंने तब से यहाँ इस उत्तर पर आधारित एक लेख लिखा है: snorf.net/blog/2014/01/04/…
Snorfalorpagus

3

मैंने एक डमीइंटरफेस भी एक साथ रखा है, जो आपको क्यूजीआईएस प्लगइन्स स्टैंडअलोन का परीक्षण करने में सक्षम बनाता है। Snorfalorpagus ब्लॉग पढ़ने के बाद, यहाँ मेरे उत्तर की जाँच करें

वास्तविक जीवन का उदाहरण खोजने के लिए, मैं किस तरह से परीक्षण (एड) करता हूं, QGIS- प्लगइन्स इस github प्रोजेक्ट को https://github.com/UdK-VPT/Open_eQuarter/tree/master/mole पर आते हैं और परीक्षणों पर नज़र डालते हैं - पैकेज।


-1

यह मदद कर सकता है: क्यूटेस्ट और यूनीटेस्ट http://www.voom.net/pyqt-qtest-pample के साथ पाइक GUIs का परीक्षण करें


1
यह सवाल में "इस पृष्ठ" से जुड़ा हुआ है (स्पष्ट रूप से बहुत स्पष्ट रूप से नहीं)। मेरी समस्या यह है कि मैं एक ऐसे इंटरफ़ेस का परीक्षण कैसे करूं जिसे QGIS में परतों के साथ कॉम्बो बॉक्स जैसी चीजों के साथ चलाने के लिए डिज़ाइन किया गया है।
स्नोरफालोर्पगस
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.