2010-06-21 5 views
11

나는 bash 또는 다른 언어로 작성된 명령 행 유틸리티에서 테스트를 실행하는 방법을 찾고있다.테스트 명령 행 유틸리티

내가

setup: 
    command = 'do_awesome_thing' 
    filename = 'testfile' 
    args = ['--with', 'extra_win', '--file', filename] 
    run_command command args 

test_output_was_correct 
    assert_output_was 'Creating awesome file "' + filename + '" with extra win.' 

test_file_contains_extra_win 
    assert_file_contains filename 'extra win' 

같은 문장을했을 테스트 프레임 워크를 찾으려면 아마도 기본 테스트 케이스 이러한 명령을 실행하여 임시 디렉토리를 설정하고 분해에서 제거합니다.

필자는 다른 그럴듯한 후보 언어보다 훨씬 익숙하기 때문에 Python에서 무언가를 사용하고 싶습니다.

나는 언어를 효과적으로 인식하지 못하게하는 DSL (또는 자신의 언어, 보는 방법에 따라 다름)을 사용할 수 있다고 상상한다. 그러나 내 테스트 기술은 대개 테스트를 생성하는 코드를 작성하기 때문에 이상적이지 않을 수 있습니다.

테스트를 실행하는 유틸리티에 대한 정보가 많기 때문에이 문제를 해결하기가 다소 어려울 수 있습니다. 이는 내가 찾고있는 것의 반대입니다. command --help의 출력에 포함 doctest를위한

지원은 우리가 일반적으로 할 (과 OO 언어의 불가사의 중 하나) 어떤 ... 추가 보너스 :

+1

단위 테스트 셸 스크립트에 대한 질문에서 유용한 정보를 얻을 수 있습니다. http://stackoverflow.com/questions/971945/unit-testing-for-shell-scripts –

+0

@gareth_bowles : 멋진, 감사합니다. 링크. bash와 호환되는 shunit2를 사용해 볼 수도 있습니다. – intuited

답변

13

체크 아웃 ScriptTest :

from scripttest import TestFileEnvironment 

env = TestFileEnvironment('./scratch') 

def test_script(): 
    env.reset() 
    result = env.run('do_awesome_thing testfile --with extra_win --file %s' % filename) 
    # or use a list like ['do_awesome_thing', 'testfile', ...] 
    assert result.stdout.startswith('Creating awesome file') 
    assert filename in result.files_created 

그건 합리적으로 사용할 수-doctest가 아니라.

+0

소리가 멋지다! 감사! – intuited

1

잘 될 것은의 모든 구성 요소를 작성하는 것입니다 실제로 응용 프로그램을 만들기 전에 응용 프로그램. 모든 구성 요소는 테스트 목적 (명령 줄, 일반적으로)을 위해 실행될 독립 실행 형 방법을 가질 수 있으며이를 통해 각각의 완전한 프로그램으로 생각하고 향후 프로젝트에서 사용할 수 있습니다. 당신이 원한다면 기존 프로그램의 무결성을 테스트하는 것입니다 ... 음, 가장 좋은 방법은 그것이 작동하는 방법이나 더 깊은 방법을 깊이 배워야한다는 것입니다. 소스를 읽으십시오. 또는 더 깊게 : 강제로 테스트 할 봇을 개발하십시오. 3

죄송합니다.

+0

확실히 .. 그 일을하는 좋은 방법입니다. 내가 말하는 것은 "단위 테스트"라고 불리는 반면, "수용 테스트"또는 "기능 테스트"또는 "통합 테스트"를 수행하는 도구 모음을 원합니다. 이것은 단위 테스트 할 수있는 코드를 검증하는 추가 수단을 제공하고 또한 단위 테스트 할 수없는 코드에 대한 일종의 테스트를 허용하기위한 것입니다 : bash 스크립트 (-shudder- bash 유닛 테스트 프레임 워크); 제대로 문서화되지 않은 방식으로 행동하는 독점적 인 아웃 - 오브 - 하우스 유틸리티; 또는 측면의 패인 플이 단일 루틴에서 혼합 된 코드. – intuited

+0

또한 귀하의 용어와 함께, 내가 뭘 찾고있는 것 같아요 "봇 프레임 워크"입니다. – intuited

+0

내가 원하는 것은 CLI가있는 프로그램을위한 일반 테스터를 찾는 것입니다. 나는 매우 열악한 프로그램을 깨닫기가 어렵다고 생각한다. 왜냐하면 너무 나쁜 프로그램은 예측할 수 없기 때문이다. 당신이 충분히 잘못된 소프트웨어를 보았을 때 소스가 없다면, 가장 좋은 선택은 비슷한 프로그램을 찾으십시오. 아니면 왜 안돼? 포럼에 귀하의 문제를 게시]] 그게 아니면 내가 놓친 게 뭔가? 내가 그랬다면, 당신의 개인적인 사건에 대해 더 명백히하려고 노력하십시오. – sadasant

0

존재할 수도 있지만 나는 인식하지 못한다. 나는 이런 종류의 자동화를 위해 예상치 못했던 활용도가 낮은 도구를 지적했다. 특히 다단계 상호 작용을 지원하려는 경우 단순히 명령을 보내고 출력을 확인하는 것이 아니라 더 많은 입력으로 출력에 응답하는 것입니다. 자신의 시스템을 구축하는 경우, 조사 할 가치가 있습니다.

pexpect라고하는 expect의 python 재 구현이 있습니다. expect 라이브러리에 대한 직접 인터페이스도있을 수 있습니다. 나는 파이썬 녀석이 아니기 때문에 그들에 대해 많이 말할 수 없었다.

1

나는이 질문이 오래되었다는 것을 알고있다. 그러나 나는 대답을 찾고 있었기 때문에 일어나는 다른 누구에게도 내 자신을 추가 할 것이라고 생각했다.

전체 면책 조항 : 내가 언급 한 프로젝트는 내 자신이지만 완전히 무료이자 오픈 소스입니다.

매우 비슷한 문제가 발생하여 내 자신의 solution이 굴러 들었습니다.

from CLITest import CLITest, TestSuite 
from subprocess import CalledProcessError 


class TestEchoPrintsToScreen(CLITest): 
    '''Tests whether the string passed in is the string 
    passed out''' 

    def test_output_contains_input(self): 
     self.assertNotIsInstance(self.output, CalledProcessError) 
     self.assertIn("test", self.output) 

    def test_ouput_equals_input(self): 
     self.assertNotIsInstance(self.output, CalledProcessError) 
     self.assertEqual("test", self.output) 

suite = TestSuite() 

suite.add_test(TestEchoPrintsToScreen("echo test")) 

suite.run_tests() 

이 내 문제를 통해 저를 얻을 충분히 잘했다,하지만 난 그게 가능 (마음에 테스트 발견 스프링) 등이 견고하게 몇 가지 더 많은 작업을 사용할 수 있습니다 알고 : 테스트 코드는 다음과 같이됩니다. 도움이 될 수 있으며 항상 좋은 추론을 좋아합니다.

관련 문제