Можно утверждать, что вам потребуется функциональный тест, а не блок тест, но давайте все равно попробуем!
Пока можно тестироватьзапускать скрипт как есть через exec()
, это считается плохой практикой.Давайте сделаем рефакторинг:
def main():
import sys, os
sys.path.append(os.path.join(os.path.dirname(__file__), '..', 'MyPackage'))
import TkOps
TkOps.start_GUI()
if __name__ == '__main__':
main()
Затем давайте установим, что должен тестировать модульный тест, например:
sys.path
обновлен с правильным путем для MyPackage
start_GUI
называется
Тогда модульный тест mokist [1] может выглядеть так:
@mock.patch("sys.path", copy.copy(sys.path))
@mock.patch.dict(sys.modules, TkOps=mock.MagicMock())
def test_main():
main()
# minimal validation of sys.path side effect
# ideally this would check that path bit points to real directory
assert any(p.endswith("/MyPackage") for p in sys.path)
# validation of expected call
assert sys.modules["TkOps"].start_GUI.called
A Для классического модульного теста потребуется графический выход в GUI, например:
def start_GUI(dry_run=False):
import tk
...
if not dry_run: tk.foobar()
[1] https://agilewarrior.wordpress.com/2015/04/18/classical-vs-mockist-testing/