내 대답은 아마도 처음에는 아마 이상 할 것 입니다. 코드의 부작용 에 대해 테스트를 수행해야한다고 생각하기 때문에 테스트 할 시간을 찾지 못합니다 . 그리고 부작용으로 나는 컴퓨터 과학 용어를 의미합니다 .
함수 (...)는 값을 반환하는 것 외에도 (...) 외부 세계와 (...) 관찰 가능한 상호 작용이있는 경우 부작용이 있다고합니다.
"외부 세계와의 상호 작용"부분을 강조하기 위해 인용했습니다. 화면에 인쇄 될 때 UI에서 테스트하기를 원합니다 ( "[테스트 시작]]은 일반적으로 기능이 필요하기 때문에 실제로는 불가능합니다. 자동화 된 테스트를 기록하거나 작성하기위한 UI ").
다른 답변들에 따르면이 "수락 테스트"를 자동화하여 빠르게 일어날 수 있도록했습니다. 이것은 맞지만 원래 문제를 완전히 해결하지는 못합니다. 합격 시험을 작성할 시간이 충분하지 않으면 어떻게됩니까?
코드가 외부 세계와 상호 작용 한 후 즉, 무언가를 인쇄하고 입력을 기대하면 테스트에 대한 시야를 확보해야합니다. 부작용의 문제는 실제로 테스트 할 수 없다는 것입니다. 귀도 반 로섬 (Guido van Rossum)과의 인터뷰를 읽는 동안 나는 새벽에 컴퓨터를 종료한다는 진술은 그것을 실행해야만 작동 할 수 있다고 말했다.
이 "언제 스트 성 (unestability)"에 대한 해결책은, 만약 당신이 일단 진술이 효과가 있다는 것을 증명했다면, 당신은 그것을 어디에서나 사용할 수 있고 그것을 사용하여 그 일을 수행 할 수 있다는 것을 이해하는 것입니다. 함수에서 분리하고 다른 모든 것을 테스트하십시오 .
이 예제를 귀하의 질문에 더 가깝게 가져 가면 함수는 이제 전체 라이브러리 또는 프레임 워크 일 것입니다. 컴퓨터를 종료하는 대신 사용자 인터페이스가 인쇄됩니다. 응용 프로그램의 해당 부분에 들어가면 값 비싼 수락 테스트 (예 : 일종의 외부 관찰)를 통해서만 테스트 할 수 있기 때문에 호출을 최대한 멍청하고 안정적으로 유지 하십시오.
UI를 "외국 영역"으로 간주하는 것은 실제로 올바른 관점입니다. 사용자가 제공하지 않은 라이브러리의 논리를 테스트 할 필요가 없으며, 아마도 놀랍게도 현실적인 관점입니다. 예를 들어 MyWidget.draw()
단일 픽셀 수준으로 호출하는 것, 예를 들어 원하는 것을 테스트 하는지 예상하십니까?
이는 수용 테스트가 중요하지 않거나 건너 뛸 수 있다는 것을 의미하지는 않습니다. 다른 답변에서 알 수 있듯이 유지하고 자동화하는 것은 엄청난 이점이 있습니다. 그러나 동일한 스프린트에서 테스트하고 코딩 할 시간을 찾으려면 가능한 한 부작용이없는 코드를 유지하십시오.