Unittest для вызова графического интерфейса TKinter - PullRequest
0 голосов
/ 06 декабря 2018

Предположим, что скрипт запускает графический интерфейс TKinter (например, scripts/launch_GUI.py) и является частью пакета PyPI (например, MyPackage).

.
├── appveyor.yml
├── MyPackage
│   ├── TkOps.py
│   └── CoreFunctions.py
├── README.md
├── requirements.txt
├── scripts
│   ├── launch_CLI.py
│   └── launch_GUI.py
├── setup.py
└── tests
    └── MyPackage_test.py

Скрипт запуска очень минималистичен:

#!/usr/bin/env python2
if __name__ == '__main__':
    import sys, os
    sys.path.append(os.path.join(os.path.dirname(__file__), '..', 'MyPackage'))
    import TkOps
    TkOps.start_GUI()

Какой unittest вы бы порекомендовали оценить, правильно ли запускается графический интерфейс TKinter при запуске launch_GUI.py?

Примечание : я только хочу оценить, выполняет ли скрипт запуска свою работу и запускает ли GUI, а не может ли пользователь взаимодействовать с GUI.

1 Ответ

0 голосов
/ 13 декабря 2018

Можно утверждать, что вам потребуется функциональный тест, а не блок тест, но давайте все равно попробуем!

Пока можно тестироватьзапускать скрипт как есть через 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/

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...