Custom Checks

ecu.test kann um eigene Prüfungen für Packages, Projekte und Analysepackages erweitert werden. Custom Checks werden als Python-Klassen implementiert und aus UserPyModules geladen.

Überblick

Custom Checks werden über die Modulkonstante MODULE_TYPE und die passende Basisklasse erkannt:

  • 'PACKAGE_CHECK' mit AbstractPackageCheck

  • 'PROJECT_CHECK' mit AbstractProjectCheck

  • 'ANALYSIS_PACKAGE_CHECK' mit AbstractAnalysisPackageCheck

Info

Die Schnittstelle ist in der ecu.test Interface Python Bibliothek ecutest-interface enthalten.

Ablage und Struktur

Eigene Check-Module werden im Workspace unterhalb von UserPyModules abgelegt.

Die Klasse muss folgende Methoden bereitstellen:

  • GetName()

  • Run(item) mit einer Rückgabe als Liste von CheckResult-Einträgen

Minimales Beispiel für einen Package-Check

from tts.interface.customCheck import AbstractPackageCheck, CheckResult

MODULE_TYPE = 'PACKAGE_CHECK'


class MyPackageCheck(AbstractPackageCheck):
    def __init__(self, internalApi):
        self._internalApi = internalApi

    def GetName(self):
        return 'MyPackageCheck'

    def Run(self, package):
        checkResults = []
        if len(package.GetDescription()) == 0:
            checkResults.append(CheckResult('Description must not be empty!'))
        return checkResults

Prüfergebnisse und Schweregrade

Jeder Fund wird als CheckResult beschrieben.

Unterstützte Schweregrade sind:

  • note

  • warning

  • error

  • exception

Felder ID und Origin

CheckResult unterstützt außerdem die optionalen Felder id und origin.

  • id identifiziert den Fundtyp. Dieses Feld kann im benutzerdefinierten Check gesetzt werden (z.B. invalid-var-name, deprecated-parameter).

  • origin Namensraum eines Bibliotheksworkspaces oder ‚internal‘ für mitgelieferte Checks. Wird von ecu.test gesetzt.

Beispiel mit id

from tts.interface.customCheck import CheckResult, Severity

result = CheckResult(
        'Variable name does not match naming convention.',
        severity=Severity.WARNING,
        id='invalid-var-name',
)

Optionale Fixes

Custom Checks können Fixes bereitstellen, die im selben Prüfungsdialog über das Kontextmenü anwendbar sind. Fixes werden über Fix definiert und liefern ein FixResult zurück. Der Callback erhält das geprüfte Element und ein Progress-Objekt.

import os

from tts.interface.customCheck import AbstractPackageCheck, CheckResult

MODULE_TYPE = 'PACKAGE_CHECK'


class DesignerPackageCheck(AbstractPackageCheck):
    def __init__(self, internalApi):
        self._internalApi = internalApi

    def GetName(self):
        return 'MyDesignerPackageCheck'

    def InsertDesigner(self, package, progress):
        progress.SetCaption('Applying fix...')
        package.Attributes.SetValue('Designer', os.getlogin())
        return FixResult(Result.FIXED, 'Fix applied.')

    def Run(self, package):
        checkResults = []
        if 'Designer' not in package.Attributes.GetNamesAndValues():
            checkResults.append(
                 CheckResult(
                     'Designer must not be empty!',
                     severity=Severity.WARNING,
                     fixes=[
                         Fix('Insert currently logged in user', self.InsertDesigner),
                     ],
                 )
            )

Info

ecu.test enthält Vorlagen für Custom Checks, die beim Start der Anwendung in den Workspace kopiert werden können.