Packagegenerator für Projekte

Hinweise zur Verwendung finden Sie im Abschnitt Packagegenerator im Kapitel Projekt-Editor.

Die Packagegeneratoren werden im Projektgeneratoren-Verzeichnis abgelegt.

Die Schnittstelle von Projekt-Packagegeneratoren ist in der Package Generator API dokumentiert.

Info

Jede Python-Datei darf nur genau eine Klasse PackageGenerator enthalten.

Jedes CycleData-Objekt repräsentiert ein generiertes Package. Allgemein kann folgender Workflow verwendet werden, um Packages zu generieren:

  1. Ein CycleData-Objekt mittels cd = self.CreateCycleData() erzeugen.

  2. Die Testschritte auf dem CycleData-Objekt erzeugen (über cd.packageInstance).

  3. Über yield cd wird das generierte Package an ecu.test übergeben und sofort ausgeführt.

Diese Schritte können beliebig oft wiederholt werden, um die gewünschte Zahl von Packages zu generieren.

Info

Für kompliziertere Fälle wird empfohlen, zunächst ein Package (im folgenden Template-Package genannt) zu erstellen, das der Packagegenerator über die Object API geeignet modifizieren kann, um die gewünschten Packages zu erzeugen.

Damit der Generator bei dieser Strategie z.B. in CreateCycleData in jeder Iteration stets auf das nicht modifizierte Template-Package zugreift, sollte man die Modifikationen nach dem Öffnen des Template-Packages in einem try-Block kapseln und im anschließenden finally-Block das Template-Package schließen.

Beispiele

Einfaches Beispiel für die Implementierung der API

# -*- coding: utf-8 -*-

from tts.core.project.generator.PackageGenerator import PackageGenerator
import os
import wx


class PgTextParser(PackageGenerator):
    ID          = 'b0905230-d72b-11e2-9566-dc801fb4729d'
    NAME        = 'Textdatei Parser'
    DESCRIPTION = 'Verarbeitet eine Textdatei zeilenweise'
    SERIALIZE   = {'filename' : ('FILENAME', 'unicode', r'')}

    def __init__(self):
        self.filename        = r''
        self.parameterDicts  = []
        self.targetItemCount = 0

    def GetDialog(self):
        return DlgFileSelector(self)

    def GetParameterText(self):
        return 'Filename: {}'.format(self.filename)

    def PreGeneration(self):
        self.parameterDicts = []
        self.targetItemCount = 0
        with open(self.filename, 'r') as fileDescriptor:
            for textLine in fileDescriptor.readlines():
                comment = "'{0}'".format(textLine.strip())
                self.parameterDicts.append({'comment': comment})
                self.targetItemCount += 1

    def GetTargetItemCount(self):
        return self.targetItemCount

    def GenerationIterator(self):
        for params in self.parameterDicts:
            cd = self.CreateCycleData()
            testStep = cd.objectApi.PackageApi.TestStepApi.CreateTsComment(params['comment'])
            cd.packageInstance.AppendTestStep(testStep)
            yield cd

    def PostGeneration(self):
        pass

    def Check(self):
        if not os.path.exists(self.filename):
            return ['Datei existiert nicht!']
        return []


class DlgFileSelector(wx.FileDialog):
    def __init__(self, generator):
        super().__init__(None,
                         'Select text file',
                         wildcard='Text files (*.txt)|*.txt',
                         style=wx.FD_OPEN | wx.FD_FILE_MUST_EXIST)
        self.generator = generator

    def ShowModal(self):
        result = super().ShowModal()
        if result == wx.ID_OK:
            self.generator.filename = self.Path
        return result

Mitgelieferte Beispiele

Um das mitgelieferte Beispiel verwenden zu können, muss dieses zunächst in Ihren Workspace kopiert werden.

Aktivieren Sie hierzu im Dialog zur Workspace-Auswahl die Option Beispiele kopieren. Dadurch werden die nötigen Beispiele in den Workspace übernommen.

Package generator example

Im Verzeichnis <Projektgeneratoren-Verzeichnis>/PackageGenExample des Beispiel-Workspaces findet sich der Packagegenerator PkgGenDLC. Dieser veranschaulicht den Grundaufbau eines Generators und den Zugriff auf die DataBrowser- und die Internal API von ecu.test, welcher er sich bedient, um dort vorhandene Informationen als Grundlage für die Generierung zu verwenden.

Der Generator realisiert eine einfache Prüfung der Botschaftslängen auf dem CAN. Dafür verfügt der Generator über einen Dialog zur Festlegung eines Bussystems. Die in der Testkonfiguration für dieses Bussystem festgelegte Beschreibungsdatei wird dann im Folgenden als Quelle für die Generierung verwendet. Dabei werden die Botschafts-Id und die Längendefinition (DLC) aus der Beschreibung abgefragt. Außerdem wird aus jeder Botschaft ein Signal ermittelt und zur Aufnahme registriert, damit die Botschaft aufgezeichnet wird. Im Verlauf des Testfalls wird die Buskommunikation nun aufgezeichnet und anschließend wird in der über Botschafts-Id und DLC parametrierten Traceanalyse geprüft, ob der DLC jeder Botschaft der Spezifikation entspricht.

Der Generator findet im Projekt ProjectWithPackageGenerator im Verzeichnis <Package-Verzeichnis>/ExamplePackages/PackageGenExample des mitgelieferten Beispiel-Workspaces Verwendung. Um diesen auszuführen, muss das Projekt in ecu.test geöffnet und durch einen Rechtsklick auf den Generator DLC check Generator die Option ‚Projekt generieren‘ ausgewählt werden. Nach Eingabe eines Projektnamens, wird das Projekt generiert und ist im Package-Verzeichnis des Workspaces zu finden.

Eine implizite Ausführung des Generators durch Ausführung des Projektes ist nur möglich, wenn eine Testkonfiguration, eine Testbenchkonfiguration, eine dazugehörige Busdatenbank sowie ein geeigneter Trace zur Verfügung gestellt werden.