지속적인 개선 (일명 소프트웨어 경화) 프로세스를 구현하는 올바른 방법이 있습니까?

StackOverflow https://stackoverflow.com/questions/1835622

문제

각 릴리스 각 릴리스는 고객이 소프트웨어에서 몇 가지 오래된 문제를 찾는 것으로 보입니다. 실제로 우리의 새로운 코드가 일반적으로 견고 할 때 모든 릴리스에 여러 버그가있는 것처럼 보입니다.

우리는 테스터가 작은 문제보다 앞서 나가기 위해 매달 단일 앱에서 몇 시간의 월간 회귀 테스트를하는 추가 테스트를 구현하려고 노력했습니다. 우리는이 프로세스를 소프트웨어 경화 프로세스라고하지만 버그를 충분히 잡는 것처럼 보이지 않으며 항상 새로운 코드가 있기 때문에 매우 백 버너 프로세스처럼 느껴집니다.

이런 종류의 테스트에 대한 트릭이 있습니까? 한 번에 하나의 특정 기능을 대상으로해야합니까?

도움이 되었습니까?

해결책

테스트 절차를 개발할 때 이러한 종류의 테스트를 구현할 수 있습니다.

  • 단위 테스트 (기능을 테스트하기 위해 프로젝트의 Invididual 구성 요소 테스트), 이러한 테스트는 소프트웨어의 오류가 발생할 수있는 위치를 정확히 지적 할 수 있기 때문에 중요합니다. 기본적 으로이 테스트에서는 단일 기능을 테스트하고 Mock Objects를 사용하여 동작, 다른 객체/엔티티의 반환 값을 시뮬레이션합니다.

  • 당신이 언급 한 회귀 테스트

  • 특성화 테스트, 한 예제는 자동으로 생성 된 입력 (사용자 입력 시뮬레이션)에서 프로그램을 자동으로 실행하고 결과를 저장하고 모든 버전의 결과를 이러한 결과와 비교할 수 있습니다.

처음에는 이것이 제자리에 설치하기가 매우 무겁지만 자동화되지 않은 비 회귀 테스트에 더 많은 릴리스 및 더 많은 버그 수정이 추가되면 시간을 절약하기 시작해야합니다.

수많은 멍청한 테스트를 설계하는 함정에 빠지지 않는 것이 매우 중요합니다. 테스트를 통해 인생이 더 쉬워 야합니다. 테스트가 깨진 곳을 이해하면 너무 많은 시간을 보내면 문제를 더 나은 메시지/이해하는 것과 같은 테스트를 재 설계하여 문제를 신속하게 찾을 수 있습니다.

환경에 따라 이러한 테스트는 개발 프로세스와 연결될 수 있습니다.

내 환경에서, 우리는 버전싱에 SVN을 사용하고, 봇은 모든 개정판에 대한 테스트를 실행하고 실패한 테스트와 메시지를 깨뜨린 개정자와 기여자 (그의 로그인)를 반환합니다.

편집하다:

내 환경에서 우리는 C ++와 C#의 조합을 사용하여 금융에 사용 된 분석을 제공합니다. 코드는 C ++였으며 인터페이스를 C#으로 마이그레이션하고 C ++의 핵심을 유지하려고하는 동안 상당히 오래되었습니다 (주로는 주로 때문에. 속도 요구 사항)

C ++ 테스트의 대부분은 손으로 작성된 단위 테스트 및 회귀 테스트입니다.

C# 측면에서 우리는 단위 테스트를 위해 Nunit을 사용하고 있습니다. 우리는 몇 가지 일반적인 테스트가 있습니다.

우리는 0 경고 정책을 가지고 있으며, 사람들이 코드 의이 부분에 대한 경고를 우회하는 것이 왜 유용한 지 정당화 할 수없는 한 경고를 생성하는 코드를 커밋하는 것을 명시 적으로 금지합니다. 우리는 예외 안전, 설계 패턴 사용 및 기타 여러 측면에 대한 규칙이 있습니다.

설명과 모범 사례를 설명하는 것은 코드의 품질을 향상시키는 또 다른 방법입니다.

다른 팁

이런 종류의 테스트에 대한 트릭이 있습니까?

"우리는 테스터가 작은 문제보다 앞서 나가기 위해 매달 단일 앱에서 몇 시간의 월간 회귀 테스트를 수행하도록했습니다."

"회귀 테스트"는 "오래된 기능을 수동으로 운동하는"것을 의미한다고 생각합니다.

이전에 찾은 적이없는 오래된 버그를 찾고 있는지 여부를 결정해야합니다. 또는, 이전에 실행 된 테스트를 반복하여 이전에 테스트 한 기능이 변경되지 않았는지 확인하십시오. 이것들은 두 가지 반대입니다.

"회귀 테스트"는 나에게 후자를하고 있음을 의미합니다.

문제가 "고객이 소프트웨어에서 몇 가지 오래된 문제를 찾는 것"이라는 점이 있으면 고객이 이전에 실행 한 적이없는 테스트를 실행하고 있습니다 (이 경우 실행 해야하는 문제를 찾으려면 새로운 오래된 소프트웨어 테스트) 또는 그들은 당신이 버그를 찾고 있습니다. 가지다 이전에 테스트하고 발견되었지만 찾은 후에는 결코 고쳐지지 않았습니다.

한 번에 하나의 특정 기능을 대상으로해야합니까?

정확히 무엇을하려고합니까 :

  • 고객이 찾기 전에 버그를 찾으십니까?
  • 고객에게 거의 잘못이 없음을 확신 시키십시오 새로운 개발?
  • 테스트에 가능한 한 적은 시간을 보내십니까?

매우 일반적인 조언은 버그가 가족에게 산다는 것입니다. 따라서 버그를 찾으면 부모와 형제 자매와 사촌을 찾으십시오.

  • 다른 모듈에서 정확히 동일한 버그가있을 수 있습니다.
  • 이 모듈은 다른 모듈보다 더 끔찍할 수 있습니다 (아마도 오프일에 Somone에 의해 작성됨).이 모듈의 다른 모든 종류의 버그를 찾으십시오.
  • 아마도 이것은 더 나은 테스트 커버리지가 필요한 전체 영역 (또는 전체 유형의 요구 사항)을 제안하는 문제 (성능 문제 또는 낮은 메모리 문제) 중 하나 일 것입니다.

다른 조언은 고객의 기대를 관리하는 것과 관련이 있다는 것입니다. "실제 문제는 실제로 새로운 코드가 일반적으로 견고 할 때 모든 릴리스가 여러 버그가있는 것처럼 보이게합니다." 새로 작성된.

항상 새로운 코드가 있기 때문에 매우 백 버너 프로세스처럼 느껴집니다.

소프트웨어 Develoment는 배경, 버너에서 발생하지 않습니다. 누군가가 작업 중이거나 그렇지 않습니다. 경영진은이 작업에 다른 사람을 할당할지 여부 (즉, 기존의 기존 버그 버그를 찾거나, 예기치 않지만보고되지 않은 버그를 고치 든) 또는 새로운 개발에 집중하고 고객은 버그 감지를합니다.


편집하다: 테스트가 버그를 찾는 유일한 방법은 아니라고 언급 할 가치가 있습니다. 또한 :

  • 비공식 디자인 리뷰 (35%)
  • 공식 설계 검사 (55%)
  • 비공식 코드 리뷰 (25%)
  • 공식 코드 검사 (60%)
  • 코드의 개인 데스크 점검 (40%)
  • 단위 테스트 (30%)
  • 구성 요소 테스트 (30%)
  • 통합 테스트 (35%)
  • 회귀 테스트 (25%)
  • 시스템 테스트 (40%)
  • 저용량 베타 테스트 (<10 사이트) (35%)
  • 대량 베타 테스트 (> 1000 개 사이트) (70%)

내가 각각 옆에 두는 비율은 각 기술에 대한 결함 제거율의 척도입니다 (McConnel의 243 페이지에서 가져온 것 소프트웨어 추정 책). 가장 효과적인 두 가지 기술은 공식 코드 검사와 대량 베타 테스트로 보입니다.

따라서 공식 코드 리뷰를 도입하는 것이 좋습니다. 이는 블랙 박스 테스트보다 결함을 감지하는 데 더 나을 수 있습니다.

코딩이 끝나 자마자 먼저 장치 테스트를 시작해야합니다. 거기에서 수정해야 할 몇 가지 버그가 발생하고 새로운 버그가 왔는지 여부를 찾기 위해 다른 라운드 단위 테스트를 수행해야합니다. 단위 테스트를 마친 후에는 기능 테스트를해야합니다.

당신은 여기서 당신의 테스터가 매월 회귀 테스트를 수행하고 있다고 언급했지만 여전히 오래된 버그가 나오고 있습니다. 따라서 테스터와 함께 앉아 정기적으로 업데이트해야한다고 생각하면 테스트 사례를 검토하는 것이 좋습니다. 또한 검토 중에 버그가 오는 모듈 또는 기능에 대한 스트레스를 강조합니다. 해당 영역에 스트레스를주고 해당 영역에서 더 많은 테스트 사례를 추가하고 RGRESSION 테스트 사례에 추가하여 새로운 빌드가 발생하면 해당 테스트 사례가 실행되어야합니다.

프로젝트가 장기적 인 경우 한 가지 더 시도 할 수 있으며 테스터와 대화하여 회귀 테스트 사례를 자동화해야합니다. 밤과 같은 시간에 테스트 케이스를 실행하는 데 도움이되며 다음 날에는 결과를 얻을 수 있습니다. 또한 회귀 테스트 사례가 정기적으로 업데이트되지 않고 오래된 회귀 테스트 사례와 새로운 진행 테스트 사례를 실행하여 테스트되지 않은 모듈이 몇 개 누락 될 때 주요 문제가 발생하므로 회귀 테스트 사례가 업데이트되어야합니다.

단위 테스트에 대한 많은 이야기가 있으며 더 이상 동의 할 수 없었습니다. Josh가 단위 테스트가 기계화 된 프로세스라는 것을 이해하기를 바랍니다. 해당 단위 테스트에서 PJ에 동의하지 않습니다. 앱을 코딩하기 전에 작성해야합니다. 이것을 TDD 또는 테스트 중심 개발이라고합니다.

어떤 사람들은 중간 계층 코드를 운동하지만 GUI 코드 테스트를 무시하는 단위 테스트를 작성합니다. 그것은 부적절합니다. 응용 프로그램의 모든 계층에 대한 단위 테스트를 작성해야합니다.

단위 테스트도 코드이므로 테스트 스위트에 대한 QA 문제가 있습니다. 코드 커버리지가 양호합니까? 단위 테스트에 잘못된 양성/네거티브 오류가 있습니까? 올바른 것을 테스트하고 있습니까? 품질 보증 프로세스의 품질을 어떻게 보장합니까? 기본적으로, 이에 대한 답은 동료 검토와 문화적 가치로 이어집니다. 팀의 모든 사람들은 위생 위생에 대한 좋은 테스트를 위해 노력해야합니다.

시스템에 버그가 일찍 도입 될수록 시스템에 더 오래 머무를수록 제거하는 데 더 어려워지고 비용이 많이 듭니다. 그렇기 때문에 지속적인 통합으로 알려진 것을 조사해야합니다. 올바르게 설정하면 지속적인 통합은 프로젝트가 하루 종일 변경 사항을 확인한 직후에 전체 단위 테스트 제품군으로 프로젝트를 컴파일하고 실행한다는 것을 의미합니다.

빌드 또는 단위 테스트가 실패하면 문제가있는 코더와 빌드 마스터가 알림을받습니다. 그들은 팀과 협력하여 가장 적절한 코스 수정이 무엇인지 결정합니다. 때로는 문제를 해결하고 수정 사항을 확인하는 것만 큼 간단합니다. 빌드 마스터 및 팀 리드는 추가 개입이 필요한 중요한 패턴을 식별하기 위해 참여해야합니다. 예를 들어, 가족 위기는 개발자의 코딩 품질을 바닥으로 만들 수 있습니다. CI와 일부 관리 감독이 없으면 진행 상황을 깨닫고 시정 조치를 취하기까지 6 개월의 버그가 필요할 수 있습니다.

당신은 당신의 개발 환경이 무엇인지 언급하지 않았습니다. 당신이 j2ee 상점이라면, 나는 당신이 다음을 조사 할 것을 제안합니다.

  • 지속적인 통합을위한 cruisecontrol
  • CruiseControl과 잘 통합되어 있기 때문에 소스 코드 버전 관리 컨트롤의 전복
  • DI가 지속적인 통합 목적으로 장치 테스트를 더 쉽게 기계화 할 수 있기 때문에 Spring
  • 중간 계층 테스트를위한 주니
  • 단위 테스트를위한 httpunit
  • 스트레스 테스트를위한 Apache Jmeter

(모두) 기존 물건에 대한 테스트 전략을 거슬러 올라가는 것은 고통입니다. 길고 어렵고 아무도 그것을하고 싶지 않을 것입니다. 그러나 새로운 버그가 들어 오면 해당 버그 주변의 테스트가 개발 될 것을 강력히 권장합니다. 버그 보고서를받지 못하면 (a) 작동하거나 (b) 사용자가 작동하지 않는다고 신경 쓰지 않습니다. 어느 쪽이든, 시험은 시간 낭비입니다.

식별 되 자마자 테스트를 작성하십시오. 빨간색. 지금. 그런 다음 버그를 수정하십시오. 고정되어 있는지 확인하십시오. 테스트가 지금인지 확인하십시오 초록. 새로운 버그가 들어 오면 반복하십시오.

미안하지만 아마도 당신은 충분히 테스트하거나 너무 늦거나 둘 다를 테스트하지 않을 수도 있습니다.

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top