2012-05-03 3 views
4

파이썬을 사용하여 입문 프로그래밍을 가르치고 싶습니다. 경량 단위 테스트 프레임 워크를 찾고 있습니다. 나는 unittest를 살펴 봤는데, - 내가 말할 수있는 한, 그것은 미친 듯이 보인다. non - lightweight.파이썬에서 경량 단위 테스트하기

예를 들어, 여기에 내가 쓸 수 있도록하고 싶습니다 내용은 다음과 같습니다

import unittest 

def f(x): 
    return x+2 

checkEqual(f(3),5) 

... 그리고 다른아무것도. 내가 어디에서 왔는지 보여주기 위해, 이것은 라켓의 초기 학생 언어로 쓰는 것입니다 :

(define (f x) 
    (+ x 2)) 

(check-expect (f 3) 5) 

... 그리고 그게 전부입니다. 분명히 누군가이 도구를 썼고, 나는 그것을 발견하지 못했을 까?

(.. 사과는 불꽃 유혹의 모양에 대한 미리 이것은 심각한 문제이다)

SELF-EDIT가 : 누구 전에

이 지적 : 네, 데프 checkEqual를 작성할 수 (A , b) : print (a == b); 나는 조금 더 많은 것을 찾고 있는데, 허용 오차를 가진 숫자를 검사 할 수 있어야하고, 실패한 테스트 케이스만을 프린트해야한다. 얼마나 많은 테스트 케이스가 실패했는지 말해 줄 수 있어야한다. 다시 말하지만,이 코드를 작성할 수 있다고 확신합니다. 나는 바퀴를 다시 발명하는 것을 피하려고 노력하고있다.

+0

나는 당신이 다음과 같이 쓸 의도가 있다고 생각한다 :'from unittest import checkEqual' –

+0

내 컴퓨터에서 "ImportError : name checkEqual을 가져올 수 없습니다"라는 오류 메시지가 표시됩니다. –

+0

내 컴퓨터에서'import unittest' ...'NameError : name 'checkEqual'이 정의되지 않았습니다. –

답변

4

doctest를 멋진 제안,하지만 당신이 가까이 예제 코드를 얻으려면 내가 (pytest.org) py.test을 제안합니다.

w:\tmp>py.test tt.py 
============================= test session starts ============================= 
platform win32 -- Python 2.6.6 -- pytest-2.2.3 
collected 1 items 

tt.py . 

========================== 1 passed in 0.01 seconds =========================== 

난을 변경하는 경우 : 나는라는 파일 tt.py과 py.test와 실행, 그것은 다음과 같습니다 것을 넣으면

def f(x): 
    return x+2 

def test_equal():  # py.test looks for functions that start with test_ 
    assert f(3) == 5 

: 귀하의 예는 무언가 같이 기록 될 것입니다 F (3) == 6 주장, 내가 얻을 다시 실행 : 그것은 또한 발견 등 여러 CPU에 걸쳐 테스트를 배포,

w:\tmp>py.test tt.py 
============================= test session starts ============================= 
platform win32 -- Python 2.6.6 -- pytest-2.2.3 
collected 1 items 

tt.py F 

================================== FAILURES =================================== 
_________________________________ test_equal __________________________________ 

    def test_equal():  # py.test looks for functions that start with test_ 
>  assert f(3) == 6 
E  assert 5 == 6 
E  + where 5 = f(3) 

tt.py:5: AssertionError 
========================== 1 failed in 0.01 seconds =========================== 

py.test도까지 확장, 그리고 당신이 범위를 실행할 수 있습니다 및 unittest 테스트를 실행하고 Doctest를 실행할 수도 있습니다.

+0

이것은 가장 좋은 것 같습니다. 필자는 반향 맛을 지닌 "function-starting-with-test_"를 완전히 사랑하지는 않지만 훌륭한 솔루션 인 것처럼 보인다. 감사! –

+0

나는 동의한다 (양쪽 점 :-) – thebjorn

5

나는 Doctest을 권하고 싶습니다.

귀하의 예는과 같습니다

def f(x): 
    """ 
    >>> f(3) 
    5 
    """ 
    return x + 2 

왜?

  1. 그것은 매우 간단합니다 : 그것은 작동
  2. "나는이 일을 실행할 때 내가 다시이 답변을 얻을해야" 함수 수준 - 클래스 이전에 테스트를 도입 할 수 있습니다.
  3. 대화식 Python 환경을 미러링합니다.
+0

아야! 비 가치 중립적 인 표현을 용서해주세요. 그러나 앉아있는 곳에서 보면, 음 ... 단지 아주, 아주, 비 최적이라고 말하려합니다. 문자열 구문 분석을 기반으로하는 모든 항목은 매우 취약합니다. 여기에 열세 가지가 잘못되어있는 것을 볼 수 있습니다. 아주 좋지 않다. 나는 정말로 내 혀를 물고있다. –

+0

@JohnClements Doctest는 가장 강력한 단위 테스트 프레임 워크는 아니지만 분명히 문자열을 잘못 해석하는 것은 인터프리터의 정확한 입력과 출력을 문서 문자열에 지나친 것이기 때문에 큰 문제는 아닙니다. 나는 당신의 상황에 맞다고 생각하지 않습니다. 왜냐하면 대부분 다른 어떤 것보다 간단한 회귀 테스트에 더 효과적이기 때문입니다. 당신이 더 TDD 스타일로 가르치고 싶다고 가정하고 있습니다. 프레임 워크를 강타하지 마십시오. 작은 프로젝트에서 일하는 것을 확인하는 아주 간단한 방법입니다. – Wilduck

1
import unittest 

def f(x): 
    return x + 2 

class TestFunctionF(unittest.TestCase): 
    def test_f(self): 
     self.assertEqual(f(3), 5) 

if __name__ == '__main__': 
    unittest.main() 

는 생산 :

---------------------------------------------------------------------- 
Ran 1 test in 0.000s 
OK 
+0

블레치! 첫 날 학생에게 그 뜀새를 모두 타이핑한다고 상상할 수 있습니까? –

+2

왜 그렇습니까. 예, 상상할 수는 있습니다. OK, 아마도 두 번째 날 :) – alan

+1

유머에 감사드립니다. 나는 너를 화나게하지 않았기 때문에 기쁘다. :) –

2

두 가지 일반적인 대안은 nosepy.test입니다. 둘 다 아주 가벼운 구문을 가지고 있지만 완전한 기능을 갖추고 있습니다.

여기에 코 확장 소개입니다 : http://ivory.idyll.org/articles/nose-intro.html

을 그리고 여기 샘플 기능 및 테스트하여 py.test입니다 :

# content of test_sample.py 
def func(x): 
    return x + 1 

def test_answer(): 
    assert func(3) == 5 

실행 명령 줄에서 테스트 :

$ py.test 
=========================== test session starts ============================ 
platform darwin -- Python 2.7.1 -- pytest-2.2.2 
collecting ... collected 1 items 

test_sample.py F 

================================= FAILURES ================================= 
_______________________________ test_answer ________________________________ 

    def test_answer(): 
>  assert func(3) == 5 
E  assert 4 == 5 
E  + where 4 = func(3) 

test_sample.py:5: AssertionError 
========================= 1 failed in 0.02 seconds ========================= 
관련 문제