Εισαγωγή βημάτων python behave από υποκαταλόγους

Εισαγωγή βημάτων python behave από υποκαταλόγους

Published on 31 October, 2019 by Evangelos Mantadakis

Το πρόβλημα

Κατά τη χρήση του python behave 1.2.7, ενδέχεται σύντομα να καταλήξετε με πολλαπλά βήματα προσπαθώντας να βρείτε έναν τρόπο να τα οργανώσετε σε υποκαταλόγους.

tests/
+-- feature/
     +-- *.feature
+-- steps/
    +-- menu_steps/
        +-- user_menu_steps.py
        +-- admin_menu_steps.py
        +-- organisation_menu_steps.py
    +-- profile_steps/
        +-- user_profile_steps.py
        +-- admin_profile_steps.py
environment.py
behave.ini

Ωστόσο, η παραπάνω στρατηγική θα αφήσει τον behave runner να διαμαρτύρεται ότι τα βήματα δεν μπορούν να βρεθούν.

"Undefined step. Rest part of scenario is skipped"

Η Λύση

Ένας τρόπος για να επιλύσετε αυτό το ζήτημα είναι ο εξής:

Βήμα 1

Μετατρέψτε όλους τους υποκαταλόγους βημάτων σε modules προσθέτοντας ένα κενό αρχείο init.py σε κάθε υποκατάλογο βημάτων.

+-- steps/
    +-- __init__.py
    +-- menu_steps/
        +-- __init__.py
        +-- user_menu_steps.py
        +-- admin_menu_steps.py
        +-- organisation_menu_steps.py
    +-- profile_steps/
        +-- __init__.py
        +-- user_profile_steps.py
        +-- admin_profile_steps.py

Βήμα 2

Εισαγάγετε δυναμικά όλα τα submodules βημάτων μέσα στον κατάλογο steps προσθέτοντας τα εξής στο steps/init.py:

import os
import pkgutil

__all__ = []
PATH = [os.path.dirname(__file__)]
for loader, module_name, is_pkg in pkgutil.walk_packages(PATH):
    __all__.append(module_name)
    _module = loader.find_module(module_name).load_module(module_name)
    globals()[module_name] = _module

(Βασισμένο στο: https://stackoverflow.com/questions/3365740/how-to-import-all-submodules/3365846#3365846 )

Έτοιμο!

Έχουμε δοκιμάσει τον παραπάνω κώδικα χρησιμοποιώντας Python 3.7 και python-behave 1.2.7.