2010-08-19 75 views
4

我正在为具有多个相互依赖的服务的Web应用程序构建一个集成测试。所有这些都依赖共享资源才能正确运行。我希望确保系统中的数据在其正常运行时保持健全,因此我利用了实时服务。我使用Python来构建它,这是我对如何沙箱的服务理念:使用Python沙盒网络服务

  • 构建的利用多重的BaseManager一个测试运行
  • chroot囚禁的每一项服务,运行它们作为后台服务
  • 有听众从服务传入连接响应,并吐出数据

这看起来理智?其他想法包括将每个服务作为一个进程来运行,或者使每个服务都有自己的python virtualenv来运行。

+0

是不一样的Apache实例在运行所有这只是普通的网络服务配置? – 2010-08-19 14:51:58

+2

目标并不完全清楚您想要实现什么。服务是否会更改外部提供程序中的数据?你需要控制从外部提供商收到的数据吗? – knutin 2010-08-25 17:24:26

回答

0

第三种可能性是最简单的 - 通过让自己的守护进程成为中间环节并避免任何锁定问题只处理直接访问资源,所有其他进程需要通过它才能访问。

0

最简单的事情之一是拥有一个提供请求的python进程池,然后终止并由shell脚本重新启动。 这个小型库http://codespeak.net/execnet/ 提供了一个非常小的脚本来创建服务器,它侦听请求然后退出。

看看这个食谱: Instantiate gateways through sockets 我用它来建立一个简单的不可知的python进程集群。他们可以执行小型的python代码,如果你把每个服务都监牢,你可以获得很好的隔离。

顺便说一下,我建议你避免在相同的python进程上有不同的权限(sandobox)。这是不实际的:例如几年前,Zope/Plone在托管时存在很多问题,因为设计不当的插件可能会占用整个大型站点。

Python的过程是快速的火灾和关机,操作系统可以处理动态负载以更好的方式,然后我们的应用程序代码:)

1

你肯定不希望第一现场数据来检验。为了构建集成测试,您应该首先嘲笑您的依赖关系,并使用您控制的I/O集。预期投入和产出非常重要。在进行集成测试时,构建这些单元测试将对您有很大的帮助。

至于你的具体问题,你可以使用代理来拦截数据或装饰你的调用函数来添加日志记录。查看面向方面编程(AOP)以获取有关拦截器的更多信息。

如果您使用WSGI,您可以编写一个中间件来处理拦截和日志记录。看看CherryPy的wsgiserver.py模块,寻求帮助; Django也使用中间件,他们的文档可能能够帮助中间件。

0

也许你应该退后一步,先问几个问题。

  • 什么是测试最重要的部分?
  • 设置该测试有多困难?
  • 设置测试的成本是否值得获得测试结果?
  • 我可以通过更简单的测试获得我想要测试的大部分内容吗?

任何你走我会使用一个基于实时数据和期望的数据成为什么。这使得我们的测试是确定性的,因此是自动化的。

如果最重要的部分是逻辑的一部分,可以经由与已知的输入/输出和嘲笑一个单元测试进行测试。

如果测试集成部分真的是最重要的,然后我会尝试和打击嘲讽掉尽可能多的移动部件之间的平衡,因为我为了做一个更易于管理的测试做感觉很舒服。

的多个网络资源使用的系统越复杂,越测试中,它应该有。您必须考虑计时问题,服务正常运行时间,超时,错误状态等。您也可能陷入创建非确定性测试的陷阱。如果你的断言最终寻找时间上的差异,依靠特定的时间安排,或者依靠一种不可靠的服务来破坏很多;你可能会因为假阳性中断的“噪音”而导致一项毫无价值的测试。

如果你想开车朝使用持续集成模型,你还需要考虑其管理(启动和关机)或多个进程与每个测试运行的复杂性。一般而言,如果可以让测试成为单个进程运行,而其他“进程”是对代码中相应起点的函数调用,则可以获得更简单的测试。

0

你可以,如果你想使用纯Python实现与PyPy玩。