2009-04-20 2 views
2

저는 현재 Rails 테스트 스위트를보고 있습니다. 세부 사항은 알 수 없지만 전체 제품군 (유닛/기능/일부 통합)의 실행 시간은 5 분 이상으로 연장 될 수 있습니다.Rails 테스트 스위트에서 Factory를 사용하는 것의 더러움과 빼기?

우리는 전적으로 설비에 의존하고 있으며 우리가해야하는만큼 조롱하고 스텁하지 않습니다.

다음 몇 가지 스프린트는 적용 범위를 개선하고 더 나은 테스트를 작성하며보다 중요한 테스트를 효율적으로 작성하는 데 초점을 맞출 예정입니다.

우리 테스트에서 좀 더 조롱과 스터 빙을 제외하고, 우리는 대부분의 공장 여자와 우리의 비품을 교체하는 것을 고려하고 있습니다. 비슷한 상황을 겪고있는 많은 행복한 사람들을 보았지만 공장으로 이전하는 데는 부족함이 없었습니다. 다양한 리소스의 벤치 마크를 사용할 때 좀 느린 벤치 마크를 보았지만 공장이 좋은 이유는 확실하지 않으므로 이러한 벤치 마크를 사용하지 않을 이유가 있습니다.

아무도 공장을 사용하지 않아야하는 이유 또는 이유에 대해 알려 줄 수 있습니까?

감사합니다.

답변

6

좋은 테스트 스위트를 위해 엔티티 간의 모든 종속성 설정에 몇 가지 문제가있을 수 있습니다. 어쨌든, 많은 설비를 유지 보수하는 것보다 훨씬 쉽습니다.

설비 :

  • 하드 유지하기 위해 관계 (특히 다 대다);
  • 테스트 스위트 런타임은 대개 DB 히트가 더 많아서 더 느립니다.
  • 테스트는 스키마 변경에 매우 민감합니다.

공장 :

  • 당신이 현재의 단위 테스트에서 테스트하지 않는 모든 스텁;
  • 공장에서 테스트 할 엔티티를 준비하십시오. 공장에서 실제 이점을 보여주는 곳입니다. 새로운 테스트 사례를 설정하는 것은 쉽습니다. YAML 파일을 대량으로 저장할 필요가 없기 때문입니다.
  • 테스트에 집중하십시오. 테스트에서 시나리오를 변경해야하는 경우에는 사고 방식을 바꾸지 않아도됩니다. 스텁이 적당하고 공장을 쉽게 사용자 정의 할 수 있다면 괜찮을 것입니다.

그래서 공장은 좋은 방법 인 것처럼 보입니다. 내가 볼 수있는 단점은 다음과 같습니다.

  • 조명기에서 이전하는 데 소비 한 시간.
  • 시나리오를 정상적으로 유지하려면 약간의 노력이 필요할 수 있습니다.
10

올렉의 대답은 훌륭하지만 두 가지를 모두 사용하는 사람의 관점을 제시하겠습니다.

고정물은 Rails 커뮤니티의 채찍질 소년이었습니다. 모든 사람들은 조명기의 단점을 이해하지만 아무도 자신의 강점을 실제로 옹호하지 못합니다. 필자의 경험으로 볼 때, 공장 자체는 설비와 마찬가지로 유지하기가 어려울 수 있습니다 (실제로 스키마에 따라 다름).공장의 진정한 힘은 고정물 기반 통증을 선택적으로 대체하는 것입니다. 몇 가지 구체적인 내용에 대해 이야기 해 봅시다.

첫 번째 문제는 성능입니다. 데이터베이스를 치지 않고 대부분의 앱을 테스트 할 수 있다면 상당한 속도 향상을 볼 수 있지만 대부분의 애플리케이션에서 데이터베이스를 전부 사용하지 않고 테스트하는 것이 현명한 방법이라고 생각하지 않습니다. 어떤 시점에서 전체 스택을 테스트하려고합니다. 조롱하거나 스텁 할 때마다 미묘한 버그가 포함될 수있는 인터페이스에 대한 가정을하고 있습니다. 따라서 상당 수의 테스트에서 데이터베이스를 조회해야한다고 가정하면 트랜잭션 픽스쳐 (입니다)는 모든 테스트에 대해 전체 환경을 인스턴스화하는 것보다 훨씬 빠를 수 있습니다.

여러분의 개발 스위트의 크기가 실질적으로 다음 단계로 발전하기 위해 Continuous Integration을 바라 볼 필요가 있습니다. 아무리 속도를 높이더라도 개발자가 기다리는 데는 오랜 시간이 걸립니다. 어쩌면 autotest을 보시고 개별 레벨에서 도움을 받으십시오. 그러나 궁극적으로 CI는 개발자의 민첩성을 희생하지 않으면서도 테스트 규율을 유지할 수 있도록 해줄 것입니다.

조명기가 실제로 빛나는 곳은 기능/통합 테스트입니다. 필자가 보는 방법은 테스트를 위해 앱이 건강한 기본 상태를 설정해야한다는 것입니다. 대부분의 단위 테스트는 실제로 이것을 필요로하지 않습니다. 공장을 이용하면 아주 좋은 단위 적용 범위를 얻을 수 있습니다. 그러나 기능 테스트에서 특정 페이지가 수십 개의 모델에 영향을 미칠 수 있습니다. 나는 각 테스트마다 그 모든 것들을 설정하고 싶지 않습니다. 더욱 복잡한 시나리오를 만들면서, 나는 세계 데이터 상태를 다시 만드는 데 더 가까워지고있다. 정확히 처음에 어떤 조명기가 디자인 되었는가?

나는 다른 모든 것이 평등하다는 논쟁의 여지가있는 믿음은 레일 테스트를 사용하여 20 단위 테스트를 한 가지 기능 테스트보다 선호합니다. 왜? 기능 테스트는 사용자에게 전송 된 최종 결과가 정확함을 증명하기 때문입니다. 단위 테스트는 기능의 미묘한 차이에 영향을 미치지 만, 결국에는 전체 사이트를 파괴하는 인터페이스에 버그가있을 수 있습니다. 기능 테스트는 브라우저에서 실제로 페이지를로드하지 않고도 배포를 수행 할 수 있다는 확신을줍니다. 나는 모든 것을 스텁 (stub)하고 양쪽 인터페이스를 테스트하고 동일한 적용 범위를 얻을 수 있다는 것을 알고 있습니다.하지만 작은 CPU를 희생하여 하나의 간단한 테스트에서 전체 스택을 테스트 할 수 있다면 훨씬 더 좋을 것입니다.

그럼 조명기에 대한 최선의 방법은 무엇입니까? 모든 모델은 데이터의 광범위한 범주를 포함하는

  • 는 소수를 설정
  • 많은 모델과 컨트롤러를 초월 주요 새로운 기능을 추가 할 때, 주요 국가에게
  • 피를 표현하기 위해 몇 가지 새로운 설비를 추가 단지 몇 가지 검사에 필요한 시험 매김 또는 기타 대량 생성을 위해 더 작은/더 지역화 변동/제거 필드를
  • 사용 공장을
  • 를 사용하여 공장을 추가 제외 된 비품을 편집

또한 실용적인 테스트 조언을 위해 Jay Fields' blog을 권하고 싶습니다. 제가 제이의 블로그에 대해 가장 좋아하는 점은 테스트가 프로젝트마다 매우 다르다는 것, 그리고 한 프로젝트에서 작동하는 것이 다른 프로젝트에서 반드시 작동하지 않는다는 것입니다. 그는 교리에 대해 짧고 실용주의로 길다.

관련 문제