[PYTHON] Testautomatisierung beginnend mit L-Chika (5) Embedded Web Camera und OCR

1. Zuallererst

Dies ist die 5. Testautomatisierungsserie, die mit L Chika beginnt.

Testelementtechnologie zur Automatisierung von Abnahmetests mit M5Stack und Python Webkamera-Bilderfassung, Bildbeschneidung, OCR-Testläufer, der mit interaktiver Shell durchgeführt wurde Integrieren und automatisieren.

Die Artikel finden Sie hier.

  1. Testautomatisierung beginnend mit L Chika
  2. Testautomatisierung beginnend mit L Chika (2) Verbesserung der Wartbarkeit von Testskripten
  3. Testautomatisierung beginnend mit L-Chika (3) Einbau eines Oszilloskops
  4. Testautomatisierung beginnend mit L Chika (4) Verbesserung der Wartbarkeit von Testskripten (2)

2. Reparatur des Testläufers

--Erstellen Sie die folgenden Befehle und Funktionen.

|Befehl|Streit|Funktion |--------+--------+-------- |open_cam|Kameragerätnummer|Führen Sie OpenCV Video Capture aus |close_cam|Keiner|Geben Sie OpenCV Video Capture frei |capture_cam|Dateiname|Nehmen Sie das Kamerabild auf und speichern Sie es in einer Datei |crop_img|Geben Sie den Dateinamen ein
Ausschnittposition (vertikal)
Ausschnittposition (horizontal)
Name der Ausgabedatei|Schneiden Sie den angegebenen Bereich aus der Bilddatei aus und speichern Sie ihn in der Datei |open_ocr|Keiner|Stellen Sie PyOCR zur Verfügung |exec_ocr|Name der Bilddatei, die auf OCR angewendet werden soll|OCR US ASCII-Zeichenfolgen aus Bilddateien

test-runner.py


#!/usr/bin/python3

#
# This software includes the work that is distributed in the Apache License 2.0
#

from time import sleep
import serial
import codecs
import csv
import sys
import visa
import cv2
from PIL import Image
import pyocr
import pyocr.builders

UNINITIALIZED = 0xdeadbeef

def open_cam(camera_number):
    return cv2.VideoCapture(camera_number)

def close_cam(cam):
    if cam != UNINITIALIZED:
        cam.release()

def capture_cam(cam, filename):
    if cam != UNINITIALIZED:
        _, img = cam.read()
        cv2.imwrite(filename, img)
        return True
    else:
        print("CAM Not Ready.")
        return False

def crop_img(filename_in, v, h, filename_out):
    img = cv2.imread(filename_in, cv2.IMREAD_COLOR)
    v0 = int(v.split(':')[0])
    v1 = int(v.split(':')[1])
    h0 = int(h.split(':')[0])
    h1 = int(h.split(':')[1])
    img2 = img[v0:v1, h0:h1]
    cv2.imwrite(filename_out, img2)
    return True

def open_ocr():
    ocr = pyocr.get_available_tools()
    if len(ocr) != 0:
        ocr = ocr[0]
    else:
        ocr = UNINITIALIZED
        print("OCR Not Ready.")
    return ocr

def exec_ocr(ocr, filename):
    try:
        txt = ocr.image_to_string(
            Image.open(filename),
            lang = "eng",
            builder = pyocr.builders.TextBuilder()
        )
    except:
        print("OCR Not Ready.")
    else:
        return txt

def serial_write(h, string):
    if h != UNINITIALIZED:
        string = string + '\n'
        string = str.encode(string)
        h.write(string)
        return True
    else:
        print("UART Not Initialized.")
        return False

def open_dso():
    rm = visa.ResourceManager()
    resources = rm.list_resources()
    #print(resources)
    for resource in resources:
        #print(resource)
        try:
            dso = rm.open_resource(resource)
        except:
            print(resource, "Not Found.")
        else:
            print(resource, "Detected.")
            return dso

    #Throw an error to caller if none succeed.
    return dso

def main():
    is_passed = True
    val = str(UNINITIALIZED)
    cam = UNINITIALIZED
    ocr = UNINITIALIZED
    dso = UNINITIALIZED
    uart = UNINITIALIZED

    with codecs.open('script.csv', 'r', 'utf-8') as file:
        script = csv.reader(file, delimiter=',', lineterminator='\r\n', quotechar='"')

        with codecs.open('result.csv', 'w', 'utf-8') as file:
            result = csv.writer(file, delimiter=',', lineterminator='\r\n', quotechar='"')

            for cmd in script:
                print(cmd)

                if "#" in cmd[0]:
                    pass

                elif cmd[0] == "sleep":
                    sleep(float(cmd[1]))

                elif cmd[0] == "open_cam":
                    cam = open_cam(int(cmd[1]))

                elif cmd[0] == "close_cam":
                    close_cam(cam)
                    cam = UNINITIALIZED

                elif cmd[0] == "capture_cam":
                    ret = capture_cam(cam, cmd[1])
                    if ret == False:
                        is_passed = False

                elif cmd[0] == "crop_img":
                    crop_img(cmd[1], cmd[2], cmd[3], cmd[4])

                elif cmd[0] == "open_ocr":
                    ocr = open_ocr()
                    if ocr == UNINITIALIZED:
                        is_passed = False

                elif cmd[0] == "exec_ocr":
                    try:
                        val = exec_ocr(ocr, cmd[1])
                    except:
                        is_passed = False
                    else:
                        cmd.append(str(val))

                elif cmd[0] == "open_dso":
                    try:
                        dso = open_dso()
                    except:
                        is_passed = False

                elif cmd[0] == "dso":
                    try:
                        if "?" in cmd[1]:
                            val = dso.query(cmd[1]).rstrip().replace(",", "-")
                            cmd.append(val)
                        else:
                            dso.write(cmd[1])
                    except:
                        is_passed = False

                elif cmd[0] == "open_uart":
                    try:
                        uart = serial.Serial(cmd[1], 115200, timeout=1.0, dsrdtr=1)
                    except:
                        is_passed = False

                elif cmd[0] == "send":
                    ret = serial_write(uart, cmd[1])
                    if ret == False:
                        is_passed = False

                elif cmd[0] == "rcvd":
                    try:
                        val = uart.readline().strip().decode('utf-8')
                        cmd.append(val)
                    except:
                        is_passed = False

                elif cmd[0] == "eval_str_eq":
                    if str(val) != str(cmd[1]):
                        is_passed = False

                elif cmd[0] == "eval_int_eq":
                    if int(val) != int(cmd[1]):
                        is_passed = False

                elif cmd[0] == "eval_int_gt":
                    if int(val) < int(cmd[1]):
                        is_passed = False

                elif cmd[0] == "eval_int_lt":
                    if int(val) > int(cmd[1]):
                        is_passed = False

                elif cmd[0] == "eval_dbl_eq":
                    if float(val) != float(cmd[1]):
                        is_passed = False

                elif cmd[0] == "eval_dbl_gt":
                    if float(val) < float(cmd[1]):
                        is_passed = False

                elif cmd[0] == "eval_dbl_lt":
                    if float(val) > float(cmd[1]):
                        is_passed = False

                else:
                    cmd.append("#")

                if is_passed == True:
                    cmd.append("OK")
                    print(cmd)
                    result.writerow(cmd)
                else:
                    cmd.append("NG")
                    print(cmd)
                    result.writerow(cmd)
                    close_cam(cam)
                    print("FAIL")
                    sys.exit(1)

    if is_passed == True:
        close_cam(cam)
        print("PASS")
        sys.exit(0)

main()

3. Testskript

Informationen zum Überprüfen des Befehls crop_img finden Sie unter 3.2 Webcam Image Capture unter Testen elementarer Technologien für die Automatisierung von Abnahmetests mit M5Stack und Python. Ich verwende die Datei 123abc.bmp, die von / pbjpkas / items / 97b6e596a4009a71f1ab # 32 (Webcam-Bilderfassung) generiert wurde.

script.csv


open_cam,1
capture_cam,abc1234.jpg
close_cam
crop_img,123abc.bmp,234:274,240:400,123abc_crop.bmp
open_ocr
exec_ocr,123abc_crop.bmp
eval_str_eq,123-abc

4. Ergebnis der Testausführung

result.csv


open_cam,1,OK
capture_cam,abc1234.jpg,OK
close_cam,OK
crop_img,123abc.bmp,234:274,240:400,123abc_crop.bmp,OK
open_ocr,OK
exec_ocr,123abc_crop.bmp,123-abc,OK
eval_str_eq,123-abc,OK

5. Schlussfolgerung

Senden / Empfangen von UART-Befehlen, Ein- und Ausschalten der eingebauten Geräte, Spannungsmessung mit dem A / D-Wandler von Arduino, eingebautes Oszilloskop, eingebaute Webkamera, Zuschneiden von Bildern, Extrahieren und Vergleichen von Zeichenketten mit OCR Es ist jetzt möglich. Ich denke, die Möglichkeiten von CI / CD auf Systemebene für eingebettete Geräte und IoT-Geräte haben erheblich zugenommen.

[^ 1]: Installation von OpenCV, Tesseract-OCR, PyOCR, PIL und Einstellung von Umgebungsvariablen von Tesseract-OCR Testen Sie die Elementartechnologie der Automatisierung von Abnahmetests mit M5Stack und Python Siehe / items / 97b6e596a4009a71f1ab).

Recommended Posts

Testautomatisierung beginnend mit L-Chika (5) Embedded Web Camera und OCR
Testautomatisierung beginnend mit L-Chika (3) Einbau eines Oszilloskops
[Automatisierung] Bearbeiten Sie Maus und Tastatur mit Python
GRPC beginnend mit Go-Server und Dart-Client
Systemhandel ab Python 3: Investition und Risiko
Airtest, eine Frage nach der anderen. Unity App E2E Test beginnend mit Airtest und Poco