4

我在 Django 中的应用程序从另一个应用程序的 HTML 中抓取并导入数据。我测试了每个解析函数,并想测试将通过其他应用程序的爬虫。在此之后,我想做一些集成测试。为了使测试尽可能易于运行,我想通过创建一个小 Web 应用程序来模拟导入的 Web 应用程序,该 Web 应用程序提供一些硬编码的 HTML 并具有我将要经过的所有路径。

编辑:另外,我的模拟必须有一些小的动态行为 - 例如,用于测试失败和成功的登录。所以我不能只提供静态文件。

你将如何创建这样一个模拟应用程序?你会子类BaseHTTPServer吗?电脑动画?使用一些框架(如斜纹布,使用 Quixote)?或者使用 Django 是否合理?那是我正在考虑使用的解决方案,但是对于这样的问题,Django 似乎太复杂了;OTOH,对于如此小的需求,另一个框架将过于依赖,而且BaseHTTPServer太原始而无法使用。

第二次编辑:我对模拟课程、请求等不感兴趣。这不是我想要使用的方法,使用这种方法的建议不是对我的回答(尽管我很感谢好心的人建议我直到现在)。如果想我的问题太难了,就忘了我谈到了测试——一般来说,你会如何粗略地模拟一个使用 Python 的 Web 应用程序?

4

4 回答 4

2

我认为你在错误的水平上嘲笑。您的单元测试根本不必依赖外部网络服务器,即使您专门为测试运行它也是如此。您应该将urllib2.Request对象(或您正在使用的执行实际 HTTP 调用的任何对象)替换为仅返回预置数据的对象,包括无效登录的相关响应。

于 2011-11-25T19:49:36.373 回答
1

我会使用wget -r(递归下载)下载参考页面,然后使用 Apache、Nginx 或任何您用作网络服务器的东西将下载的页面作为静态页面提供。

除非您需要查看 Web 应用程序的动态更改...

于 2011-11-25T19:38:36.200 回答
0

听起来您需要使用python mock。例如,这允许您patch使用现有命令(可能正在调用外部 url)并向其中添加您自己的测试数据。

对于测试,我认为您永远不应该使用外部服务。相反,您应该在您自己的固定装置中提供您期望从该服务获得的数据,并测试您的响应处理程序是否正在完成其工作。

于 2011-11-25T21:18:25.967 回答
0

我试图遵循@Gagandeep Singh 解决方案。这似乎是最好的,在其他情况下可能是一个很好的解决方案,但它对我不起作用。

问题是我在另一个 Django 应用程序的测试目录中有一个 Django 应用程序。当我使用 运行我的应用程序的测试时manage.py test myapp,使用settings.py的是整个项目中的一个,而不是我的模拟应用程序的文件。我是通过管理 API 启动 Django并使用multiprocessing的,所以我敢打赌,我的问题的一部分来自如此复杂的交互。也许我可以解决它,但我只是决定采用另一种策略。

我决定重写BaseHTTPServer并得到一些可接受的结果。这不是一件容易的事,但我成功地启动了我的模拟应用程序。

于 2011-11-27T21:17:13.617 回答