簡単な実装でParserTesterMetaclassの__init__を動かす
code:test_metaclass_example.py
from unittest import TestCase
class ParserTesterMetaclass(type):
def __init__(cls, name, bases, bodydict):
if name == "ParserTestCase":
return
class AddTests:
def __init__(self, tester_cls):
for test_func in self.test_failures, self.test_successes:
test_name = test_func.__name__
def wrapper(self, test_func=test_func):
# selfはtester引数に渡る
test_func(self)
setattr(tester_cls, test_name, wrapper)
def test_failures(self, tester):
# testerはunittest.TestCaseのサブクラスとして想定(assertRaisesやassertEqualメソッドを持つ)
with tester.assertRaises(TypeError):
3 + "3"
def test_successes(self, tester):
tester.assertEqual(3 + 3, 6)
tester.assertEqual("3" + "3", "33")
AddTests(cls)
ParserTestCase = ParserTesterMetaclass("ParserTestCase", (TestCase,), {})
class AwesomeTestCase(ParserTestCase):
...
class FabulousTestCase(ParserTestCase):
...
AwesomeTestCaseとFabulousTestCaseにはtest_failuresとtest_successesが生える
code:shell
$ python3.10 -m unittest test_metaclass_example.py -v
test_failures (test_metaclass_example.AwesomeTestCase) ... ok
test_successes (test_metaclass_example.AwesomeTestCase) ... ok
test_failures (test_metaclass_example.FabulousTestCase) ... ok
test_successes (test_metaclass_example.FabulousTestCase) ... ok
----------------------------------------------------------------------
Ran 4 tests in 0.000s
OK