【问题标题】:Functional testing with Python WebTest使用 Python WebTest 进行功能测试
【发布时间】:2013-03-06 14:42:49
【问题描述】:

我对使用 Python WebTest 进行功能测试完全陌生,请多多包涵

我在看https://webtest.readthedocs.org/en/latest/webtest.html,所以我按照建议尝试了代码以提出请求:

    app.get('/path', [params], [headers], [extra_environ], ...)

好的,对我来说看起来很简单。我在 myapp 文件夹中创建了一个名为 test_demo.py 的文件:

    from webtest import TestApp

    class MyTests():
        def test_admin_login(self):
           resp = self.TestApp.get('/admin')
           print (resp.request)

现在这是我遇到的问题,我应该如何运行这个 test_demo.py? 我试过输入 bash

    $ bin/python MyCart/mycart/test_demo.py test_admin_login

但它没有显示任何结果。

我敢打赌,我搞错了,但文档没有多大帮助,或者我只是太慢了。

【问题讨论】:

    标签: python pyramid webtest


    【解决方案1】:

    哎呀,你少了几个步骤。

    你的程序没有做任何事情,因为你没有告诉它做任何事情,你只是定义了一个类。所以让我们告诉它做点什么。我们将使用unittest 包让事情变得更加自动化。

    import unittest
    from webtest import TestApp
    
    class MyTests(unittest.TestCase):
        def test_admin_login(self):
           resp = self.TestApp.get('/admin')
           print (resp.request)
    
    if __name__ == '__main__':
        unittest.main()
    

    运行它,我们会看到:

    E
    ======================================================================
    ERROR: test_admin_login (__main__.MyTests)
    ----------------------------------------------------------------------
    Traceback (most recent call last):
      File "test_foo.py", line 6, in test_admin_login
        resp = self.TestApp.get('/admin')
    AttributeError: 'MyTests' object has no attribute 'TestApp'
    
    ----------------------------------------------------------------------
    Ran 1 test in 0.000s
    
    FAILED (errors=1)
    

    好的,所以我们需要一个应用来测试。去哪里买?您通常希望通过config.make_wsgi_app()main 中创建您正在创建的WSGI 应用程序。最简单的方法是加载它,就像运行应用程序时的 pserve development.ini 一样。我们可以通过pyramid.paster.get_app() 做到这一点。

    import unittest
    from pyramid.paster import get_app
    from webtest import TestApp
    
    class MyTests(unittest.TestCase):
        def test_admin_login(self):
            app = get_app('testing.ini')
            test_app = TestApp(app)
            resp = test_app.get('/admin')
            self.assertEqual(resp.status_code, 200)
    
    if __name__ == '__main__':
        unittest.main()
    

    现在只需要一个类似于development.ini 的 INI 文件,但用于测试目的。您可以复制development.ini,直到您需要设置任何设置以进行测试。

    希望这能让您了解更多关于 unittest 软件包的信息。

    【讨论】:

    • 当我尝试运行 $ python -m unittest -v test_demo 时出现新错误(ImportError: No module named pyramid.paster)。我正在使用 python 3.2
    • 使用您安装金字塔的 virtualenv 中的 python。
    • 我收到 ImportError:不支持按文件名导入。我已经使用了这个命令 MBP:env $ bin/python -m unittest -v MyCart/mycart/test_demo
    • 您必须为这些内容创建单独的问题,因为如果没有看到完整的回溯,错误消息基本上毫无价值。由于脚本正在运行 unittest.main(),因此您不需要在 CLI 中使用 -m unittest。只需env/bin/python MyCart/mycart/test_demo.py
    最近更新 更多