2010-03-08 6 views
4

단위 테스트 aspect 지향 응용 프로그램 기능에 대한 최선의 방법으로 무엇을 제안하겠습니까 (글쎄요, 아마도 이것이 최고의 이름은 아니지만, 제가 올 수 있었던 최선의 방법입니다). 위로 :-)) 로깅이나 보안과 같은?단위 테스트 aspect 지향적 인 기능

이러한 것들은 응용 프로그램에서 옴니 존재하는 일종입니다, 그래서 어떻게 제대로 테스트 할 수 있습니까?

예. Python으로 Cherrypy 웹 서버를 작성한다고 가정 해 보겠습니다. 데코레이터를 사용하여 로그인 한 사용자가 주어진 페이지에 액세스 할 수있는 권한이 있는지 확인할 수 있습니다. 그런 다음 모든 페이지에 대한 테스트를 작성하여 작동 여부를 확인해야합니다 (또는 해당 페이지에 대한 보안 퍼미션을 확인하는 것을 잊어 버린 경우가 많음).

로깅 및/또는 보안이 웹 서버 "정상적인 비즈니스 구현"중에 구현 된 경우 이는 아마도 (강조 할 수도 있음) 가능성이 있습니다. 그러나 보안 및 로깅 일반적으로 후속으로 응용 프로그램에 추가되는 경향이 (또는 어쩌면 그것은 단지 내 경험, 나는 일반적으로 서버를 부여한 다음 보안 모델을 구현하도록 요청했습니다 :-)).

모든 의견을 환영합니다. 나는 현재이 문제를 '해결'했는데, 전혀 테스트하지 않았다. 감사합니다. .

+1

개별 코드 모듈을 테스트하지 않으므로 설명하는 것이 "기능 테스트"라고하는 것이 더 좋을 것이라고 생각했을 것입니다. 그런 것들을 테스트하는 것이 다른 종류의 테스트와 다른 이유는 무엇입니까? 일련의 인풋과 예상되는 아웃풋 또는 비헤이비어가 있습니다. –

+0

흠, 나쁜 점은 아닙니다. 이러한 작업 (예 : 로깅)이 응용 프로그램과 "분리 된"것처럼 보입니다. 그들은 애플 리케이션의 "원시 출력"을 변경하지 않고 오히려 부작용 만 추가하므로 테스트는 기존 테스트를 복제하는 것을 의미합니다. –

답변

0

음 ... 보겠습니다. 내 생각에 당신은 여기 (이하 "자바 AOP 전문 용어"죄송합니다) 세 가지 다른 것들을 테스트 : 인터셉터합니다 (cutpoints에서 활성화 된 기능을 구현 즉, 방법)

  • 에 의해 구현

    1. 기능을 (의도 cutpoints가 제대로 여부 활성화 여부 예) 필터의 적용 범위
    2. cutpoints과 (부작용 포함) 인터셉터

    당신은 (엄밀히 말하면) 단위 테스트 당신이 할 수있는 경우에 사이의 상호 작용 이 세 개의 레이어를 처리한다. eparatedly. 실제로 단위 테스트를 할 수 있습니다. 커버리지 도구와 모의 객체를 가진 스켈레톤 크루 애플리케이션을 사용하여 두 번째를 테스트 할 수 있습니다. 하지만 세 번째 테스트는 정확히 단위 테스트가 아니므로 테스트 환경을 설정하고, 엔드 투 엔드 테스트를 설계하고, 애플리케이션의 데이터를 입력하고 결과를 수집하는 스크립트를 작성해야 할 수도 있습니다 (웹 애플리케이션이라면 예를 들어 Selenium 사용).

  • 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) 
    

    참고 : 이것은 보안 검사를 수행하는 데 정말 끔찍한 방법이지만 데코레이터 테스트에 대한 요점을 제공합니다. 파이썬에 대한 좋은 점 중 하나입니다. 정말 일관성이 있습니다. 다음 표현식은 동일

    @g 
    def f(x): 
        return x 
    

    def f(x): 
        return x 
    f = g(f) 
    
    1

    IMHO는 페이지에 사용자 권한을 테스트하는 방법은 당신이 사용하고있는 프레임 워크의 앱 디자인 및 설계에 따라 달라집니다.

    일반적으로 권한 검사기 데코레이터를 유닛 테스트로 덮어서 항상 예상대로 작동하는지 확인한 다음 '보기'를 순환하는 테스트를 작성하십시오 (또는 cherrypy가 사용하는 모든 용어는 사용하지 않았고 사용하지 않았습니다). 아주 오랜 시간 동안)이 함수가 적절한 데코레이터로 장식되어 있는지 확인하십시오.

    로깅에 관해서는 테스트를 구체적으로 원하는 것이 명확하지 않습니다. 어쨌든, 왜 로깅 기능을 스텁 (stub)하고 거기에 무슨 일이 일어나는지 체크 할 수없는 이유는 무엇입니까?

    관련 문제