最新公告
  • 欢迎您光临起源地模板网,本站秉承服务宗旨 履行“站长”责任,销售只是起点 服务永无止境!立即加入钻石VIP
  • Python和单元测试那些事儿

    正文概述    2020-10-03   396

    Python和单元测试那些事儿

    我们来说说目前几个和测试有关的东西(全程 Python 3)。

    Mock

    Mock是个好东西呀,遇到测试中出现的不可预知的或者不稳定因素,就用 Mock 来代 替。例如查询数据库(当然像目前我们用的MongoDB,由于特别灵活,可以直接在代码里 把相应的collection替换掉),例如异步任务等。举个例子:

    import logging
    from unittest.mock import Mock
    logging.basicConfig(level=logging.DEBUG)
    #  code
    class ASpecificException(Exception):
        pass
    def foo():
        pass
    def bar():
        try:
            logging.info("enter function <foo> now")
            foo()
        except ASpecificException:
            logging.exception("we caught a specific exception")
    #  unittest
    def test_foo():
        foo = Mock(side_effect=ASpecificException())  # noqa
        logging.info("enter function <bar> now")
        bar()
        logging.info("everything just be fine")
    if __name__ == "__main__":
        test_foo()

    运行一下

    root@arch tests: python test_demo.py
    INFO:root:enter function <bar> now
    INFO:root:enter function <foo> now
    INFO:root:everything just be fine

    一个简单的测试就这么写好了。来,跟我念,Mock 大法好呀!

    doctest

    doctest属于比较简单的测试,写在 docstring 里,这样既能测试用,又能当文档 示例,是在是好用之极啊。缺点是,如果测试太复杂,doctest就显得太臃肿了(例如 如果测试之前要导入一堆东西)。举个例子:

    import logging
    logging.basicConfig(level=logging.DEBUG)
    def foo():
        """A utility function that returns True
        >>> foo()
        True
        """
        return True
    if __name__ == "__main__":
        import doctest
        logging.debug("start of test...")
        doctest.testmod()
        logging.debug("end of test...")

    测试结果

    root@arch tests: python test_demo.py
    DEBUG:root:start of test...
    DEBUG:root:end of test...

    unittest

    这个文档确实有点长,我感觉还是仔细去读一下文档比较好。

    import unittest
    class TestStringMethods(unittest.TestCase):
        def setUp(self):
            self.alist = []
        def tearDown(self):
            print(self.alist)
        def test_list(self):
            for i in range(5):
                self.alist.append(i)
    if __name__ == '__main__':
        unittest.main()

    输出结果

    root@arch tests: python test_demo.py
    [0, 1, 2, 3, 4]
    .
    ----------------------------------------------------------------------
    Ran 1 test in 0.001s

    OK

    unittest框架配合上Mock,单元测试基本无忧啦。

    pytest

    上面的单元测试跑起来比较麻烦,当然也可以写一个脚本遍历所有的单元测试文件,然 后执行。不过 pytest 对unittest有比较好的支持。

    pytest默认支持的是 函数 风格的测试,但是我们可以不用这一块嘛(而且很多时候 还是很有用的)。走进项目根目录,输入 pytest 就可以啦。它会自动发现 test_ 开头的文件,然后执行其中 test_ 开头的函数和 unittest 的 test_ 开头的 方法。

    root@arch tests: pytest
    ============================================= test session starts ==============================================
    platform linux -- Python 3.5.2, pytest-3.0.5, py-1.4.31, pluggy-0.4.0
    rootdir: /root/tests, inifile:
    collected 1 items
    test_afunc.py .
    ====================================1 passed in 0.03 seconds =======================================================
    root@arch tests:

    总结

    编译器没给python做检查,就只有靠我们手写测试了 :(

    另外其实 pytest 和 unittest 都有很多强大的特性,例如 fixture,例如 skip 掉某一部分测试。


    起源地下载网 » Python和单元测试那些事儿

    常见问题FAQ

    免费下载或者VIP会员专享资源能否直接商用?
    本站所有资源版权均属于原作者所有,这里所提供资源均只能用于参考学习用,请勿直接商用。若由于商用引起版权纠纷,一切责任均由使用者承担。更多说明请参考 VIP介绍。
    提示下载完但解压或打开不了?
    最常见的情况是下载不完整: 可对比下载完压缩包的与网盘上的容量,若小于网盘提示的容量则是这个原因。这是浏览器下载的bug,建议用百度网盘软件或迅雷下载。若排除这种情况,可在对应资源底部留言,或 联络我们.。
    找不到素材资源介绍文章里的示例图片?
    对于PPT,KEY,Mockups,APP,网页模版等类型的素材,文章内用于介绍的图片通常并不包含在对应可供下载素材包内。这些相关商业图片需另外购买,且本站不负责(也没有办法)找到出处。 同样地一些字体文件也是这种情况,但部分素材会在素材包内有一份字体下载链接清单。
    模板不会安装或需要功能定制以及二次开发?
    请QQ联系我们

    发表评论

    还没有评论,快来抢沙发吧!

    如需帝国cms功能定制以及二次开发请联系我们

    联系作者

    请选择支付方式

    ×
    迅虎支付宝
    迅虎微信
    支付宝当面付
    余额支付
    ×
    微信扫码支付 0 元