【问题标题】:How would you mock a web app in Python (for testing a Django project)您将如何在 Python 中模拟 Web 应用程序(用于测试 Django 项目)
【发布时间】:2011-11-25 19:26:57
【问题描述】:

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

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

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

第二次编辑:我对模拟类、请求等不感兴趣。这不是我想要使用的方法,使用这种方法的建议不是我的答案(虽然我很感谢那些好心地建议我这样做的好心人直到现在)。如果想我的问题太难了,就忘了我谈到了测试 - 你如何使用 Python 粗略地模拟一个 Web 应用程序一般

【问题讨论】:

  • 看看seleniumhq.org。 selenium 用于各种组织中的现代浏览器应用程序测试。
  • @GagandeepSingh 这不是我想要的。我不需要模拟浏览器,而是模拟服务器端应用程序。
  • 我知道这一点,但如果您不朝那个方向思考,我想提供可能可用的选项。不过,记住网络应用测试的解决方案是件好事。

标签: python django testing mocking basehttpserver


【解决方案1】:

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

【讨论】:

  • 可以随意称其为“集成测试” :)
【解决方案2】:

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

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

【讨论】:

  • 我几乎不会在这些服务器上使用 Apache 或 Nginx,这需要太多的配置——我只想签出我的项目并立即运行测试。 OTOH,我可以通过 Python 的SimpleHTTPServer 提供静态 HTML 服务。问题是有一些小案例,我需要在我的模拟中非常非常少的动态行为(例如,用于测试失败和成功的登录)。如果没有这种情况,我会很乐意使用您的方法...无论如何,您的回答表明我的问题不清楚。谢谢!
  • 使用 wget -r 获取页面,然后设置另一个 Django 项目以将所有下载的文件作为静态文件提供(使用 Django 很容易,您也有使用 Django 的经验)。
【解决方案3】:

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

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

【讨论】:

    【解决方案4】:

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

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

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

    【讨论】:

      猜你喜欢
      • 2014-08-30
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2023-03-12
      • 2015-07-13
      • 2021-08-16
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多