2012-04-13 4 views
0

현재 고객의 웹 사이트에서 데이터를 파싱하고있는 환경에 있습니다. 고객이 사이트를 변경하면 더 이상 정보를받지 못하는 것을 확인하기 위해 테스트를 사용하고 싶습니다.TDD 시나리오 : 조언을 찾고 있습니다.

내 첫 번째 접근 방식은 내 테스트가 클라이언트의 사이트를 조회하고 데이터가 발견되었다고 주장하는 순수 통합 테스트를 수행하는 것이 었습니다. 반쯤에 500 번의 테스트를 거쳤지 만, 테스트 실행은 참기 힘들어지고 어떤 경우에는 시간이 초과되었습니다. 그래서 나는 그들이 제공하는 핵심 보호 ​​기능을 잃지 않고 가능한 한 많은 테스트를 수행했으며 나는 350 명 정도까지 내려갔습니다. 모든 테스트를 중단하기 위해 더 많은 테스트를 추가 할까봐 두려워합니다. 나는 또한 내가 더 이상 변화를 일으킬 때 자신이 5 분 이상의 지속 시간 (일부 클라이언트는 자신의 사이트와의 통신 속도에 따라 길어질 것입니다)을 실행하지 않음을 발견합니다. 나는 이것이 완전한 실패라고 생각한다.

저는 이것에 대해 많은 생각을하고 사무실을 둘러 보았습니다. 나의 다음 시도는 내 프로젝트에서 이러한 임베디드 리소스에 대한 클라이언트 페이지를 풀고 테스트를 작성하는 것입니다. 이렇게하면 더 높은 테스트 커버리지를 얻을 수 있으며 테스트를 분리하여 다시 수행 할 수 있습니다. 그러나 변경 사항을 적용한 후이를 다시 테스트하여 페이지를 테스트 할 때 통보를 받아야합니다. 나는 클라이언트가 이것을 고수 할 것이라고 생각하지 않는다.

실패한 테스트 (고객 사이트 방문)와 동일한 기능을하지만 이전보다 훨씬 적은 수의 '무작위'통합 테스트 스위트를 사용하여이를 보완 할 것을 제안했습니다. 나는 무작위 테스트의 아이디어를 좋아하지 않습니다. 때로는 적색 불빛을 얻을 가능성과 같은 코드로 녹색 불빛을 얻는 가능성이 있습니다. 그러나 이것은 지금까지 고객의 사이트가 변경 되어도 코드가 더 이상 데이터를 찾지 못했다는 인식을 얻기 위해 들었던 최고의 아이디어처럼 들립니다.

누구나 이와 같은 환경을 테스트 한 사람이 있습니까? 나에게 테스트 커뮤니티의 제안 사항이 있습니까?

+0

외부 웹 사이트에서 데이터를 스크랩하고 있다는 것을 의미합니까? 그렇다면 큰 변화가 일어나기 전에 미리 알려줄 수 있습니까? 그렇지 않은 경우 테스트의 최소 하위 집합 (연기)에 태그를 지정하고 먼저 실행하십시오. 이 기본 세트가 통과되면 나머지 스위트를 호출합니다. – Gishu

+0

여러분의 제안에 감사드립니다. 궁리 할 좋은 정보. – Joe

답변

0

큰 테스트가 참을 수 없을 때,이 테스트 스위트를 수동으로 실행하고 있다고합니다. 당신은해서는 안됩니다. 스위트를 완료하는 데 걸리는 속도에 관계없이 백그라운드에서 지속적으로 실행되어야합니다. 그런 다음 다시 시작합니다 (관련 비용이있을 경우 지연 이후). 무언가가 잘못 될 때만 알림을 받아야합니다.

숫자가 커질수록 테스트 속도가 느려지므로 테스트를 찾아 수정하십시오. 테스트는 서로 독립적이어야하므로 더 많은 테스트를 수행하면 개별 테스트의 시간 초과가 발생해서는 안됩니다.

+0

백그라운드에서 계속 실행되는 테스트에 대한 자세한 정보가 마음에들 것입니다. 현재 변경 사항을 적용한 후 resharper 및 alt r + u + n을 사용하여 모든 테스트를 시작합니다. 나는 우리의 환경을 CI에 맡기고있다. 여기서 우리는 커밋/푸시에 대한 테스트를 자동화했다. 이 환경은 아직 그다지 없습니다. – Joe

0

내 권장 사항은 가능한 한 불확실성을 다루는 코드 부분을 격리하려고 시도하는 것입니다. 이 부분은 다른 모든 코드에서 사용하는 서비스로 작동하는 API 여야합니다. 이 방법을 사용하면 대부분의 코드를 변경으로부터 보호 할 수 있습니다.

코드의 안정된 부분은 단위 테스트를 거쳐야합니다. 테스트를 실행하는 클라이언트의 사이트에 대한 연결과 독립적 인 부분은 빠른 속도가되어야하며 테스트가 더 안정적으로 수행되어야합니다.

고객 웹 사이트의 변경 사항을 처리해야하는 부분을 줄일 수 있습니다. 이 방법으로 문제를 해결할 수는 없지만 최소한 코드를 최소화하고 코드의 한 모듈에만 집중시키는 것이 좋습니다.

웹 서비스로 데이터를 노출하도록 클라이언트에게 제안하는 것이 가장 좋습니다. 그러나 나는 그것이 당신에게 의존하지 않는다고 생각합니다 : P.

+0

예, 우리는 우리가 클라이언트와 통신하는 방법에 대한 제한이 있습니다, 당신은 거기에 머리에 못을 박았. 나는 가능한 한 그것을 분리하는 것에 동의한다. 나는 모든 파싱 로직을 그들 자신의 클래스로 가져 왔고 오직 거기에서만 그것을 수행한다. 그렇다면 필자는 필요한 모든 것을 파서에게 전달하고있다. 나는 그것을 더 멀리 제거하는 것에 더 많은 생각을 가할 것이다. 그것은 문제의 최악의 부분인데, 더 높은 수준의 추출에서 위대한 것이 될 것이다. – Joe

0

테스트를 나눠서보아야하며, 독립적으로 실행할 수있는 별도의 어셈블리로 구성해야합니다.나는 일반적으로 단위 테스트 어셈블리와 느린 실행 통합 테스트 어셈블리를 가지고 있습니다.

단위 테스트 어셈블리가 매우 빠릅니다 (코드가 모의를 사용하여 격리되어 테스트되기 때문에). 개발과 동시에 자주 실행됩니다. 통합 테스트는 느려지고 기능/체크 인을 마쳤거나 뭔가 깨뜨리는 것에 대해 나쁘게 생각하는 경우에만 실행합니다.

어쩌면 비슷한 것을 할 수도 있고, 아이디어를 더 취할 수도 있고 세 번째 테스트 스위트에서 클라이언트 UI 폴링 테스트를 더 느리게 할 수도 있습니다.

지속적인 통합 서버/프로세스가없는 경우 설정을 살펴보십시오. 이렇게하면 계속해서 소프트웨어가 만들어지고 테스트가 실행됩니다. 이것은 체크인을 모니터하고 백그라운드에서 작동하도록 설정 될 수 있으며, 실패한 경우 알림을 전송합니다. 이 위치에서 클라이언트 UI 폴링 테스트가 얼마나 오래 걸릴지 신경 쓰지 않을 것입니다. 왜냐하면 직접 실행해야 할 필요가 없기 때문입니다.

+0

이번에는 통합 및 격리 테스트를 나누는 방법을 분명히 사용하려고합니다. 테스트의 절반이 시간 싱크이기 때문에 테스트를 모두 풀고 싶지는 않습니다. 또한 CI 환경에 대한 환경을 조성하기 위해 노력하고 있습니다. – Joe

0

확실히 테스트를 분리합니다. 최소한 통합 테스트의 단위 테스트를 분리하십시오.

Martyn이 말했듯이, Continuous Integration 시스템을 제자리에 설치하십시오. Teamcity를 처음 20 회는 무료로 사용할 수있는 Teamcity를 사용합니다. 서버를 처분 할 수없는 경우 행복하게 서버에서 실행할 수 있습니다. - http://www.jetbrains.com/teamcity/

하나의 빌드 설정 모든 체크 인을 실행하고, 단위 테스트를 실행하거나, 필요하다면 빠른 실행 테스트를 실행하십시오.

매일 밤 자정 (또는 다른 편리한 시간)에 실행되도록 두 번째 빌드를 설정하고 더 이상 실행중인 클라이언트 호출 통합 테스트를 포함시킵니다. 시험을 치르는 데 얼마나 오랜 시간이 걸릴지는 중요하지 않으며, 클라이언트가 물건을 부러 뜨리면 아침에 큰 붉은 깃발이 나옵니다. 문제가있을 것으로 예상되는 경우 필요에 따라 수동으로 실행할 수도 있습니다.

관련 문제