👁️
pierreinside
  • Introduction
  • Workbench
    • VirtualBox
    • Linux
      • Linux-Paketverwaltung
      • Linux Initialisierung
      • Ubuntu 14.10 LTS
      • Ubuntu 16.04 LTS
      • Ubuntu 18.04 LTS
      • Ubuntu 20.04 LTS
      • Ubuntu - Netzwerk
    • Konsole
      • ssh
      • zsh
      • cygwin
      • Babun
      • terminator
      • Terminal Multiplexer
      • Linux Tools
    • awesome
    • Entwicklungsumgebungen
      • Texteditors
      • Visual Studio Code
      • IntelliJ - IDEA
  • Softwareentwicklungsprozess
    • Schätzungen
    • Eventstorming
    • OKR
  • Architektur
    • Uncle Bob
    • Microservices
    • NoSQL
      • ElasticSearch
    • Hystrix
    • Reactive Programming
    • AngularJS
    • Service Mesh
  • Networking
    • Dependency Injection
  • Programming
    • Java Core/EE
      • Java 8
      • Java Annotationen
      • Bean Validation
      • Enterprise Java Beans Specification
      • Dependency Injection
    • JRebel
    • Webservices
      • HTTP
      • REST
      • Spring MVC REST
      • Swagger
      • Postman
    • Spring Ecosystem
      • Spring Core
      • Spring Boot
        • Programming
        • Production Ready
        • Testing
      • Spring Cloud
      • Spring Cloud Config
      • Spring MVC
      • Spring Data
      • Spring Petclinic
    • NodeJS
    • UI-Technologie
      • Thymeleaf
      • ionic
      • Web Fonts
      • Jinja Templates
      • Twitter Bootstrap
    • Python Ecosystem
      • Python Libraries
      • Python Testing
      • Python Best-Practices
      • Python Snippets
      • Python Selenium
      • Kivy UI
      • FastAPI
      • Typer CLI
      • Django
    • Groovy
    • Persistenz
      • Transactions
        • Java TX
        • JPA TX
      • TX Handling
      • JPA
        • Eclipse Link
      • MySQL
        • MySQL Performance
        • Docker MySQL
      • Hazelcast
    • Glassfish
    • YAML
    • Angular
    • Camel
    • Zeichenkodierung
    • Kinder lernen Programmieren
  • Testen
    • Easymock
    • Mockito
  • Performance & Scalability
    • Java Performance
      • Heapdump Analysis
    • Java Concurrency
    • Instana
  • Sicherheit
    • Authentifizierung
      • OpenID Connect
      • Web-Authentication API
    • Authorisierung
      • OAuth
      • SAML
    • Spring Security
    • Zertifikate
    • Kali Linux
    • VPN
    • Zero-Trust-Networks
  • Build und Deployment
    • Maven
    • Bamboo
    • Jenkins
      • Jenkins Pipelines
      • Jenkins Pipelines Tips und Tricks
      • Jenkins-configuration-as-Code
      • Jenkins IDE
    • Travis CI
    • Shellprogrammierung
      • jq - JSON Parsing
    • Konfiguration Management
    • Vagrant
      • Vagrant-Ansible-Integration
      • Vagrant Box bauen
    • Ansible
      • Getting Started
      • Ansible Details
    • Saltstack
    • LinuxKit
    • Container
      • Docker
        • Docker Getting Started
        • Debugging Docker
        • Docker Build
        • Docker Registry
        • Docker run
          • docker run
          • docker network
        • Docker Compose
        • docker machine
        • Docker@Windows
        • Docker Host
        • Docker Scaling
        • Docker Ressources
        • Docker Logging
        • windowsContainer
      • Cloud Deployment Provider
        • AWS
          • Anwendungsdeployment
          • Workload
          • Permissions
          • Netzwerke
          • AWS CLI
            • aws-vault
          • RDS
          • Static Website Hosting
          • EKS - Elastic Kubernetes Service
          • S3
        • Google Cloud Platform
      • Docker Orchestrierung
        • CoreOS
        • Kubernetes
          • microK8s
          • minikube
          • autoscaler
          • Docker
          • k9s
        • Nomad
    • PHP
  • Operations
    • Proxy
      • NGINX
    • DNS
    • Logging
      • Graylog
      • Fluentd
    • Monitoring
      • Grafana
    • Infrastructure-as-Code
      • Terraform
        • AWS-Provider
        • GitHub-Provider
      • Packer
    • Deployment
      • Vault
      • Consul
        • Consul Template
      • Fabio
  • Rechtliches
    • Software-Lizenzen
  • Git Ecosystem
    • Git
      • Git Lifecycle Hooks
    • GitHub
      • GitHub Organizations
    • GitHub Actions
    • GitHub Pages
    • GitHub CLI
    • GitHub Copilot
    • GitHub-AWS OIDC
    • GitBook
    • GitLab
    • Bitbucket/Stash
  • Publishing
    • WordPress
    • Markdown
    • Static Site Generators
      • Hugo
      • Jekyll
    • Tiddly Wiki
    • Leanpub
    • Animationsfilme
  • Storage
    • Synology 2012
    • Synology 2021
  • Collaboration
    • Übersicht
    • Microsoft Teams
  • Konferenzen
    • Velocity Berlin 2019
  • IT mit Kindern
    • Projekt Sportstracker
    • Scratch
    • Pico Spielekonsole
  • Schule
    • Mathematik
  • Misc
    • Foto/Video
      • Foto/Video Sammlung bis 2023
        • Handbrake
        • Onedrive
      • Foto/Video Sammlung ab 2024
      • Gopro
      • Panasonic FZ1000 ii
        • als Webcam
      • AV Receiver
      • Videos erstellen
        • OBS Studio
        • Touch Portal
        • Game-Streaming
      • Kameratasche
      • Kamera 2020
    • Handy
      • 2016
      • 2018
      • 2019
      • 2021
      • 2022
    • Computer
      • Laptop
        • 2018
        • Chromebook
      • Monitor
        • 4k
      • Software
        • Command Line Interface
        • Google API
        • Plant UML
        • Chromium
        • Passwort-Manager
        • GPG
      • Dell CNF 2665 Farbdrucker
      • Dockingstation
      • Gaming PC 2021
      • Mobiles Büro
      • Mobiles Internet
      • Mobiler Router
    • Beamer Benq W1000+
    • Spielekonsole
      • 2017
        • Playstation 4
      • Pico Spielekonsole
    • Gadgets
      • iPad Pro 2015 und 2016
      • iPad Air 2024
      • Macbook Pro
      • Smartwatch
      • Slate
      • Mudi
    • Fahrrad
      • Jonas 2018
      • SQLab
    • Auto
      • Auto 2022
      • Camping
        • Camping Touren Ideen
          • Camping Tour - Gardasee 2021
        • Camper
          • Camper klein - keine Stehhöhe
            • VW Bus Erfahrungen
          • Camper gross - Stehhöhe
    • Haus
      • Klimaanlage
      • Swimming Pool
      • Quick Mill Orione 3000
      • Spülmaschine 2021
      • Hebe-Schiebetür
      • Gasgrill
      • Minibar / Mini-Kühlschrank
      • Glasfaseranschluss (Fiber-to-the-Home)
      • Smart-Home
        • Raspberry Pi
        • Heimnetzwerk
      • Homeoffice
      • Energie
        • Solar
        • Wärmepumpe
    • Freizeit
      • Musik Streaming
      • Sky
      • Online Lernplattformen
      • eScooter - ePowerFun
    • Fußball
      • Meine Arbeit als Fußball-Trainer
      • Fußball Tools
      • DFB Talentförderung
    • Google Impact Challenge
  • Englisch
Powered by GitBook
On this page
  • Einführung
  • unittest
  • Ausführung
  • pytest
  • Installation
  • Entwicklung
  • Ausführung
  • Fixtures
  • Plugins
  • tox.ini

Was this helpful?

  1. Programming
  2. Python Ecosystem

Python Testing

Das Testen hat bei untypisiertem Sprachen wie Python einen noch höheren Stellenwert, da viele Fehler nicht vom Compiler entdeckt werden können, sondern erst zur Laufzeit auftreten.

In folgendem Beispiel

name = input("Wie ist dein name?")
if name == "Pierre":
    name_int=int(name)
print(name)

tritt der Fehler int(name) erst in Erscheinung, wenn ich den Namen Pierre eingebe. Um dieses Problem zu lösen benötigt man viele Tests ... oder einen intelligenten Editor, der Python-Wissen hat und diese Probleme erkennen kann.

Der intelligente Editor hilft allerdings nur, wenn man konsequent Type Hints verwendet. Das ist ABOSULUT empfohlen ... nur nicht um Fehler zu vermeiden, sondern auch um den Komfort zu erhöhen, wenn man Code schreibt.


Einführung

  • Einführung von Realpython

Prinzipiell kann man die __main__.py eines Pakets verwenden (oder jedes beliebige Python-Modul), um Test-Code auszuführen. Hierin könnte man dann

if __name__ == "__main__":
    # testcode
    test_my_func1()
    test_my_func2()

verwenden, um die Tests auszuführen.

Allerdings sollen Tests i. a. nicht bei dem ersten Fehler zu einem Abbruch führen, sondern alle Tests ausführen und ganz am Ende eine Statistik zeigen ... mit einem entsprechenden Fehlerreport.

Hier kommen Testrunner ins Spiel, die in einem Test-Framework/Library enthalten sind:

  • unittest

  • nose2

  • pytest


unittest

Bei diesem Test-Framework muß man die Tests in Klassen schreiben, die von unittest.TestCase erben. Dadurch erhält man aber auch den Komfort von setUp() und tearDown() Methoden.

Ausführung

python -m unittest discover

pytest

  • Einführung - Realpython

Die pytest Tools führen auch unittest-Library-Tests aus.

Im Gegensatz zu unittest müssen die Tests nicht in eine Klasse gepackt werden ... es genügt:, sondern nur als Funktion

def test_always_passes():
    assert True

Installation

pip install pytest

Entwicklung

  • Parametrisierung ist ein nettes Feature, um Test-Code zu reduzieren (von hier)

@pytest.mark.parametrize("maybe_palindrome, expected_result", [
    ("", True),
    ("a", True),
    ("Bob", True),
    ("Never odd or even", True),
    ("Do geese see God?", True),
    ("abc", False),
    ("abab", False),
])
def test_is_palindrome(maybe_palindrome, expected_result):
    assert is_palindrome(maybe_palindrome) == expected_result

Ausführung

pytest

Auf diese Weise werden alle Tests unterhalb des aktuellen Verzeichnisses ausgeführt.

Folgende Filtermöglichkeiten stehen zudem zur Verfügung:

  • Name-Based-Filtering mit -k-Parameter

  • Test-Categories mit -m-Parameter

Fixtures

wiederverwendbarer Initialisierungscode ... ein Test erhält die Fixture als Parameter.

import pytest

@pytest.fixture
def people_data():
    return [
        {
            "given_name": "Pierre",
            "family_name": "Feldbusch",
            "title": "Senior Software Engineer",
        },
        {
            "given_name": "Robin",
            "family_name": "Feldbusch",
            "title": "Project Manager",
        },
    ]

def test_format_data_for_display(people_data):
    assert format_data_for_display(example_people_data) == [
        "Pierre Feldbusch: Senior Software Engineer",
        "Robin Feldbusch: Project Manager",
    ]

def test_format_data_for_excel(people_data):
    assert format_data_for_excel(example_people_data) == """given,family,title
        "Pierre Feldbusch: Senior Software Engineer",
        "Robin Feldbusch: Project Manager",
"""

Man kann Fixtures in eine Datei mit dem Namen conftest.py auslagern und die stehen allen Tests im gleichen Verzeichnis oder darunter zur Verfügung.

Plugins

pytest läßt sich über Plugins erweitern ... beispielsweise um Helper für bestimmte Frameworks (z. B. Django)


tox.ini

  • verschiedene Python versionen testen

Auf diese Weise kann man testen, ob sich ein Package auf verschiedenen Python-Versionen installieren läßt - zudem laufen die Tests auch alle auf den definierten Python-Versionen.

sehr zu empfehlen ... hab ich gelesen ...

PreviousPython LibrariesNextPython Best-Practices

Last updated 3 years ago

Was this helpful?