如何在Python中模拟一个Web应用(用于测试Django项目)
我的Django应用程序从另一个应用的HTML中抓取和导入数据。我测试了每个解析功能,现在也想测试一下爬虫,看看它如何访问那个应用。在这之后,我还想做一些集成测试。为了让测试尽可能简单,我想模拟那个被导入的网页应用,创建一个小型的网页应用,提供一些固定的HTML,并包含我将要访问的所有路径。
编辑: 此外,我的模拟应用还需要一些小的动态行为,比如测试登录成功和失败的情况。所以我不能只提供静态文件。
你会如何创建这样一个模拟应用呢?你会使用BaseHTTPServer
来做子类吗?还是用CGI?或者使用某个框架(就像twill使用Quixote那样)?或者用Django来做这个合理吗?这是我考虑的解决方案,但Django似乎对这个问题来说太复杂了;另一方面,使用其他框架又会成为一个过重的依赖,而BaseHTTPServer
又太原始,使用起来不太方便。
第二次编辑: 我对模拟类、请求等不感兴趣。这不是我想要的方式,如果有人建议我使用这种方式,那对我来说不是答案(虽然我很感激那些好心人到目前为止的建议)。如果你觉得我的问题太难回答,那就忘了我提到测试的事——你会如何粗略地用Python模拟一个网页应用呢?
4 个回答
我会用 wget -r
这个命令来下载参考页面,这个命令可以递归下载,也就是说它会把页面里的所有链接都跟着下载下来。然后,我会把下载好的页面放到 Apache、Nginx 或者你用的其他网页服务器上,让它们变成静态页面。
当然,如果你需要看到你的网站应用程序里的动态变化,那就另当别论了……
我觉得你在嘲笑错误的地方。你的单元测试根本不应该依赖外部的网络服务器,即使你是专门为了测试而运行它。你应该把urllib2.Request
这个对象(或者你用来实际进行HTTP请求的其他东西)替换成一个只返回预设数据的对象,这样就能包括无效登录的相关响应。
我试着按照 @Gagandeep Singh 的方法来做。这看起来是个不错的解决方案,可能在其他情况下也能很好地工作,但对我来说并没有奏效。
问题是,我的 Django 应用放在另一个 Django 应用的测试目录里。当我用 manage.py test myapp
运行我的应用测试时,使用的 settings.py
是整个项目的那个,而不是我这个模拟应用的配置文件。我是通过管理 API 来启动 Django 的,并且使用了 multiprocessing
,所以我觉得问题的一部分可能是因为这种复杂的交互。也许我能解决这个问题,但我最终决定换个策略。
我决定重写 BaseHTTPServer
,结果得到了还不错的效果。这不是一件简单的事,但我成功地启动了我的模拟应用。