Gleiche Tests über viele ähnliche Datendateien

Mit python und unbescheiden habe ich diese struktur des testverzeichnisses:

tests/ __init__.py test_001.py data/ data_001_in.py data_001_out.py 

woher

  • data_001_in.py : die Eingabedaten, die in den zu data_001_in.py Funktionen verwendet werden sollen
  • data_001_out.py : die Ausgabedaten, die von der zu data_001_out.py Funktion erwartet werden

Ich habe die Ein- und Ausgänge in Python-Wörterbüchern, weil es für mich einfacher ist als mit json, sqlite, etc.

Ich versuche, einen Satz von Eingabe- / Ausgabedaten mit dem gleichen Format zu verwenden und den Test über jedes Paar von Daten anzuwenden:

 tests/ __init__.py test_001.py data/ data_001_in.py data_001_out.py data_002_in.py data_002_out.py data_003_in.py data_003_out.py 

Gibt es ein Paket / Ansatz, um diese Aufgabe leichter zu machen?

One Solution collect form web for “Gleiche Tests über viele ähnliche Datendateien”

Inspiriert in der Frage Nase, unittest.TestCase und metaclass: automatisch generierte test_ * Methoden nicht entdeckt , habe ich mit einer metaclass gelöst. Zuerst wechsle ich die Verzeichnisdatenstruktur zu

 ├── data │  ├── __init__.py │  ├── data001 │  │  ├── __init__.py │  │  ├── datain.py │  │  ├── dataout.py │  └── data002 │  ├── __init__.py │  ├── datain.py │  ├── dataout.py └── metatest.py 

Zweitens mache ich eine Metaklasse, um einen neuen Test mit den Daten in den Unterverzeichnissen und Basistests zu erstellen.

 import unittest import os import copy def data_dir(): return os.path.join(os.path.dirname(__file__), 'data') def get_subdirs(dir_name): """ retorna subdirectorios con path completo""" subdirs = [] for f in os.listdir(dir_name): f_path = os.path.join(dir_name, f) if os.path.isdir(f_path): subdirs.append(f) return subdirs def get_data_subdirs(): return get_subdirs(data_dir()) def data_py_load(file_name): """ carga diccionario data desde archivo .py """ name = file_name.split('.py')[0] path_name = 'data.' + name exec_str = "from {} import *".format(path_name) exec(exec_str) return data class TestDirectories(type): def __new__(cls, name, bases, attrs): subdirs = get_data_subdirs() callables = dict([ (meth_name, meth) for (meth_name, meth) in attrs.items() if meth_name.startswith('_test') ]) data = {} for d in subdirs: data[d] = {} data[d]['name'] = d out_path = "{}.dataout.py".format(d) data[d]['out'] = data_py_load(out_path) var_path = "{}.datain.py".format(d) data[d]['in'] = data_py_load(var_path) for meth_name, meth in callables.items(): for d in subdirs: new_meth_name = meth_name[1:] # name of test to add, _test to test test_name = "{}_{}".format(new_meth_name, d) # deep copy for dictionaries testeable = lambda self, func=meth, args=copy.deepcopy(data[d]): func(self, args) attrs[test_name] = testeable return type.__new__(cls, name, bases, attrs) class TestData(unittest.TestCase): __metaclass__ = TestDirectories def _test_name(self, data): in_name = data['in']['name'] out_name = data['out']['name'] print in_name, out_name self.assertEquals(in_name, out_name) if __name__ == '__main__': unittest.main(verbosity=2) 

Und wenn ich laufe

 $ python metatest.py test_name_data001 (__main__.TestData) ... Alice Alice ok test_name_data002 (__main__.TestData) ... Bob Bob ok ---------------------------------------------------------------------- Ran 2 tests in 0.001s OK 
  • Grundlegende Python-Unbekannte TestSuite-Frage
  • Reihenfolge der Unit-Tests in Python
  • Pycharm und unittesting - strukturierungsprojekt
  • Python unittest - Gegenteil von assertRaises?
  • Unbescheidene farbige Ausgabe
  • Python unittest - setUpClass () gibt mir Ärger - warum kann ich nicht so erben?
  • GAE: Einheitsprüfung Taskqueue mit Testbed
  • Ist es möglich, dass ein Unit-Test behauptet, dass eine Methode sys.exit ()
  • Python Unittest Reporting in HTML
  • Wie kann ich denselben Testfall für verschiedene Klassen ausführen?
  • Führen Sie python-Unit-Tests als Option des Programms aus
  • Python ist die beste Programmiersprache der Welt.