单元测试面向方面的功能

时间:2010-03-08 14:03:59

标签: python unit-testing aop

我想知道你认为什么是单元测试面向方面的应用程序功能的最佳方法(好吧,也许这不是最好的名字,但它是我能想出的最好的:-))如日志记录还是安全性?

这些东西在应用程序中有点全然存在,那么如何正确地测试它们呢?

E.g。说我正在用Python编写Cherrypy Web服务器。我可以使用装饰器来检查登录用户是否具有访问给定页面的权限。但后来我需要为每个页面编写一个测试,以查看它是否有效(或更像是看到我没有忘记检查该页面的安全性权限)。

如果在Web服务器“正常业务实现”期间实现了日志记录和/或安全性,那么这可能(强调可能)是可以忍受的。但是,安全性和日志记录通常会在应用程序中添加到应用程序中(或许这只是我的经验,我通常会得到一个服务器,然后要求实现安全模型:-))。

对此非常欢迎。我目前已“解决”了这个问题,好吧 - 根本没有测试过这个问题。 感谢。

3 个答案:

答案 0 :(得分:1)

恕我直言,测试用户对页面权限的方式取决于您的应用程序的设计和您正在使用的框架的设计。

通常情况下,通过单元测试覆盖你的权限检查装饰器可能已经足够了,以确保它始终按预期工作,然后编写一个循环通过你的'视图'的测试(或任何术语cherrypy使用,没有使用它很长一段时间)并检查这些函数是否用适当的装饰器进行修饰。

至于日志记录,你不清楚你想要具体测试什么。无论如何,为什么不能存根记录功能并检查那里发生了什么?

答案 1 :(得分:0)

嗯......让我们看看。在我看来,你在这里测试三种不同的东西(抱歉“Java AOP术语”):

  1. 拦截器实现的功能(即实现在分界点激活的功能的方法)
  2. 过滤器的覆盖范围(即预期的切割点是否被正确激活)
  3. 切点和拦截器之间的相互作用(带有副作用)
  4. 如果你能分开处理这三层,你就是单元测试(严格来说)。你实际上可以先测试第一个;您可以使用覆盖工具和一些骨架工作人员应用程序与模拟对象来测试第二个;但第三个不完全是单元测试,因此您可能必须设置测试环境,设计端到端测试并编写一些脚本来输入应用程序中的数据并收集结果(如果它是一个Web应用程序,您可以例如,使用Selenium。

答案 2 :(得分:0)

我的答案是针对您提供的具体示例,而不是针对螺栓安全性可能出现的问题。装饰器只是常规功能,您可以像这样测试它们。例如:

# ... inside included module ...
def require_admin(function):
    if (admin):
        return function
    else:
        return None

@require_admin
def func1(arg1, arg2):
    pass

# ... inside unit test ...
def test_require_admin(self):
    admin = False
    f = lambda x: x
    g = require_admin(f)
    assert_equal(g, None)

    admin = True
    g = require_admin(f)
    assert_equal(g, f)

注意:这是进行安全性检查的一种非常糟糕的方式,但它可以解决测试装饰器的问题。这是关于Python的好东西之一:它真的很稳定。以下表达式是等效的:

@g
def f(x):
    return x

def f(x):
    return x
f = g(f)
相关问题