2016-08-02 2 views
0

nosetests가 유효한 테스트 클래스 인 클래스를 식별하는 방식과 관련하여 매우 이상한 문제 만 고려할 수 있습니다.Nosetests가 unittest discover가 수행하는 테스트 클래스를 보지 못함

def random_test_class(n): 
    print "Generating %d random test cases..." % n 
    def make_test(genre, ss, ps): 
     return lambda self: self.compose(genre, ss, ps) 
    return type('TestEverything', (TestBase,), 
       { 'test_%d' % i: make_test(genre, ss, ps) 
        for (i, (genre, ss, ps)) in zip(xrange(n), generate_settings()) 
       }) 

을하고, 경우에 지금

class TestEverything(random_test_class(100)): 
    pass 

으로 적절한 클래스를 초기화하는 :

내가 사용하여 기본 테스트 클래스에서 특정 상속 일반적인 type으로 테스트 클래스를 초기화하는거야 python -m unittest discover으로 표준 테스트 프레임 워크를 호출하면 테스트가 매우 행복하며 100 테스트 메소드를 정의하는 테스트 클래스로 TestEverything 클래스를 봅니다 (test_1, test_2 등 ...). 그러나 nosetests ./ -m "test_*"을 사용하면 TestEverything을 유효한 테스트 클래스로 간주하지 않으며 해당 테스트 메소드를 실행하지 않습니다.

어떻게 해결할 수 있습니까? nosetests이 제공하는 xunit 출력 프레임 워크가 필요하지만 특정 테스트 메타 클래스를 사용하여 클래스를 올바르게 초기화하는 데 필요한 모든 메타 클래스 훅을 피하는 것이 좋습니다.

답변

1

테스트에 메서드를 포함할지 여부를 결정할 때 Nose는 특성 이름 대신 메서드를 구현하는 함수의 이름 인 을 확인합니다. make_test을 변경하여 작성한 테스트에 Nose가 선택하는 이름을 갖도록하십시오.

def make_test(genre, ss, ps): 
    def test(self): 
     self.compose(genre, ss, ps) 
    return test 

귀하의 질문에 제공되는 정규 표현식과 일치합니다. test_*test이 있고 그 뒤에 임의의 수의 밑줄이 오는 이름과 일치합니다. 당신이 다른 이름을 가지고 기능을 원하는 경우 test.__name__make_test에 인덱스를 통과하고 설정할 수

참고 :

def make_test(i, genre, ss, ps): 
    def test(self): 
     self.compose(genre, ss, ps) 
    test.__name__ = 'test_%d' % i 
    return test 
관련 문제