代码之家  ›  专栏  ›  技术社区  ›  Michael Gruenstaeudl

用于调用TKinter GUI的Unittest

  •  6
  • Michael Gruenstaeudl  · 技术社区  · 6 年前

    假设一个启动TKinter GUI的脚本(例如。, 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()
    

    什么 单元测试 launch_GUI.py ?

    1 回复  |  直到 6 年前
        1
  •  3
  •   Dima Tisnek    6 年前

    可以说你需要一个 考试而不是考试 测试,但让我们试试这个!

    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 被称为

    然后 莫基斯特 [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/