단위 테스트 경쟁


12

고용주는 월 단위 테스트 날 경쟁을합니다. 하루 종일 단위 테스트를 작성하는 데 전념합니다. 분명히 한 달 내내 더 많은 테스트를 수행하지만 이것은 하루 종일입니다. 경쟁의 "우승자"에게는 상이 수여됩니다. 그러나 우리는 승자가 누구인지 판단하기가 어렵다는 것을 알게되었습니다.

각 테스트 사례에 대해 포인트를 할당했습니다. 따라서 이와 같은 단위 테스트를 작성하면 ...

for (int i = 0; i < 100; i++) {
  assertTrue(i*i, square(i));
}

당신은 100 점을 받게 될 것입니다. 분명히 이것은 간단한 예이지만 각 테스트 사례에 "포인트"를 할당 할 때 발생하는 문제를 보여줍니다.

우리는 주로 Java & Javascript 상점입니다. 그래서 메트릭으로 테스트 된 코드 분기 수를 계산하는 것이 좋습니다. 코드 커버리지 도구 (예 : EclEmma)를 통해 테스트 된 브랜치를 쉽게 계산할 수 있습니다. 그러나 Selenium 테스트를 통해이 작업을 수행하고 Javascript 소스 (아이디어)에 대한 코드 적용 범위를 얻는 방법을 확실하지 않습니다.

이 경쟁의 승자를 더 잘 결정할 수있는 방법에 대한 제안이 있습니까?

편집하다

나는 단위 테스트를 작성하는 방법을 알고, 효과적인 단위 테스트를 작성하는 방법을 알고, 무엇을 테스트할지 결정하는 데 도움이 필요하지 않습니다. 나는이 경쟁을 통제 할 수 없다. 경쟁은 계속 될 것이다. 그래서 나는 더 나은 결과를 내기 위해 약간의 입력을 추가하거나 테스트 게임을 계속합니다 (예, 게임합니다. 물론 게임합니다. 당첨 될 상이 있습니다)

편집하다

여기서 좋은 질문 을 찾는 방법에 대한 유용한 정보가 포함되어 있지만 경쟁을 평가하는 데 유용한 지표는 제공하지 않지만 이 질문 은 분명히 중복되지 않습니다.


좀 빠지는. 처음부터 깨달았습니다
Shaun

2
당신은 아직 완전히 이해하지 못하는 것 같습니다. 모든 최고의 테스트 케이스를 쓴 사람의 측정 중 하나를 완전히 주관적 또는 어느 정도이 문제가됩니다. 어떤 메트릭이 가장 효과가 좋은지는이 경쟁의 목표와 참가자의 성숙도 (즉, 가능한 최선의 테스트를 작성하지 않고 점수를 악용 할 가능성이 없는지)에 따라 다릅니다.

다시 요 나는 그들이 게임을 할 수 있다는 것을 깨달았다. 나는이 경쟁을 통제 할 수 없지만 "어떻게 더 잘할 수 있을까"라는 질문을 받았습니다
Shaun

13
경쟁하지 않기 위해 개선 된 것으로 간주됩니까? 왜 모든 것이 경쟁이되어야합니까? 왜 공동 작업을 할 수 없습니까? 더 무의미한 단위 테스트를 없애고 유용한 연기 및 회귀 테스트를 작성하는 것이 도움이 될 것입니다.
Thomas Owens

1
나는 Thomas와 함께 있습니다 ... 코드 품질이 향상 되었기 때문에 우승자가 코드베이스 / 고객이어야합니다. 단위 테스트의 코드 적용 범위를 기반으로 전체 / 그룹 목표를 설정하십시오. ... 그리고 상금을 위해 시스템을 게임하지 마십시오 ... 잘한 일에 무슨 일이 있었는지 자체 보상은 무엇입니까?
JeffC

답변:


15

이 경쟁의 승자를 더 잘 결정할 수있는 방법에 대한 제안이 있습니까?

나에게 의미있는 유일한 것은 투표하는 것입니다-모든 개발자는 다른 모든 개발자의 테스트에 자신의 것을 제외하고 몇 가지 포인트를 할당 할 수 있습니다. 어쩌면 테스트에서 3 점은 "가장 효과적인"1 점, 2 점은 1 점, 3 점은 1 점이라고 생각합니다. 가장 많은 점수를 얻은 테스트가 이깁니다. 누가 특정 테스트를했는지 미리 몰라도 포인트 할당이 완료되면 더 나은 결과를 얻을 수 있습니다.

보너스로 모든 테스트 피어를 검토하게됩니다.


2
이것은 또한 내 생각이었다. 테스트 값을 측정하는 다른 방법은 없습니다.
에릭 킹

2
그렇습니다. "좋은 테스트"는 동료 나 존경받는 당국에 의한 판단을 고려해야하는 주관적인 것입니다. 추격 지표는 많은 낭비 노력과 실질적인 가치로 이어지지 않습니다. 가장 상상력이 높은 테스트, "이전에 테스트 할 수없는 것으로 간주되는 테스트"상, 최고의 성능 테스트, 가장 효과적인 테스트, 가장 모호한 테스트, 영리한 테스트, 가장 가치있는 테스트, 최종 사용자가 가장 높이 평가할 수있는 테스트 등 여러 가지 상을 수상하는 것이 흥미로울 수 있습니다. ...
timday

6

따라서 이와 같은 단위 테스트를 작성하면 ...

for (int i = 0; i < 100; i++) {
 assertTrue(i*i, square(i));
}

당신은 100 점을 받게 될 것입니다.

루프 내 어설 션은 거의 의미가 없으며 여러 어설 션 (특히 루프 또는 맵 형태)으로 테스트하기가 어렵 기 때문에이 사람에게 0 점을 줄 것입니다 (테스트가 실제로 관련있는 것을 테스트하는 경우에도).

문제는 본질적으로 [쉬운] 속일 수없는 메트릭을 갖는 것입니다. 어설 션 수를 기반으로하는 메트릭은 작성된 LOC 당 개발자에게 지불하는 것과 정확히 동일합니다. LOC (Pay-by-LOC)와 마찬가지로 코드를 유지 관리하는 것이 거대하고 불가능하기 때문에 실제 회사 정책은 쓸모없고 잘못 작성된 테스트로 이어집니다.

어설 션 수와 관련이없는 경우 테스트 수도 관련이 없습니다. 이러한 상황에 대해 상상할 수있는 많은 메트릭 (결합 된 메트릭 포함)의 경우도 마찬가지입니다.

이상적으로는 체계적인 접근 방식을 적용하는 것입니다. 실제로 이것은 대부분의 소프트웨어 개발 회사에서 거의 작동하지 않습니다. 그래서 나는 몇 가지 다른 것을 제안 할 수 있습니다 :

  1. 테스트를 위해 쌍 검토 를 사용 하고 분당 WTF 수 와 비슷한 것을 갖습니다 .

  2. 이러한 테스트가 시간이 지남에 따라 버그 수에 미치는 영향을 측정 하십시오 . 여기에는 몇 가지 이점이 있습니다.

    • 공정 해 보인다
    • 버그 보고서와 그 운명에 대한 충분한 데이터를 수집하면 실제로 측정 할 수 있습니다.
    • 실제로 가치가 있습니다!
  3. 분기 적용 범위를 사용 하되 다른 측정 항목 및 검토와 결합하십시오. 지점 적용 범위에는 이점이 있지만 더 나은 성적을 얻기 위해 CRUD 코드를 테스트하는 것이 개발자의 시간을 보내는 가장 좋은 방법은 아닙니다.

  4. 현재 시행하고자하는 지표가 무엇인지 함께 결정하십시오 (이러한 결정은 환영받지 못하거나 일부 회사 및 팀에서는 불가능할 수도 있습니다). 측정 항목을 자주 검토하고 변경하여 관련성이 높은 측정 항목을 선택하고 모든 사람이 측정 대상과 방법을 명확하게 이해하도록합니다.


1
영점 +1 다른 이의는 AAA 일 것입니다-정리, 법, 주장; 파라미터 화 된 테스트; 구현 코드를 복사하지 않습니다 ...
thepacker

5

직원들이 버그를 찾고 더 큰 코드 범위를 달성하고 더 많은 테스트를 받도록 인센티브를 제공하기 위해이 단위 테스트 날을 조직한다고 가정합니다.

따라서 우승자는 가장 많은 버그를 발견 한 개발자이거나 테스트에서 코드 범위가 가장 많이 증가한 개발자 여야한다는 것이 합리적이라고 생각합니다.

문제 / 버그 / 결함 추적 시스템에서 새 항목이 열리면 테스트를 통해 점수를 얻습니다. 해당 이슈에 대해 이미 열려있는 항목은 포함되지 않습니다. 또한 주석에서 제안한대로 사용자 코드의 버그는 포함되지 않습니다. 다른 사람의 코드에있는 버그만 계산해야합니다. 불행히도,이 방법은 모든 실패한 테스트가 탐지되고 해당 문제가 열릴 때까지 며칠이 걸릴 수 있기 때문에 즉각적인 만족감을 제공하지 않습니다. 또한 항상 작동하지 않을 수도 있습니다. 시스템이 성숙함에 따라 테스트를 추가하여 버그를 발견하는 것은 매우 드물게 시작될 수 있습니다.

코드 범위의 증가는 새로운 테스트로 표현 된 개선의 객관적인 측정을 제공 할 수 있습니다. 먼저, 총 코드 적용 범위는 대회 전날 기록되어야합니다. 그런 다음 각 개발자는 다른 개발자가 작성한 테스트로 인한 코드 범위의 증가를 고려하지 않고 테스트만으로 발생하는 코드 범위의 증가를 어떻게 든 표시해야합니다. 즉, 누군가의 테스트가 확정되기 전에 각 개발자의 컴퓨터로 가서 새로운 코드 적용 범위를 기록 할 심판이 필요할 것입니다.

또한 코드 적용 범위를 고려하면 문제에서 제공 한 예제와 같은 바보 같은 일을하는 대신 실제 테스트를 작성하는 사람들에게 공정한 보상이 제공됩니다.


2
유망한 것처럼 들리지만 "시스템 게임"행동은 다음 테스트 경쟁에서 "발견"될 수있는 알려진 유일한 버그의 모음을 보여줍니다
timday

3
한 가지 방법은 다른 사람이 작성한 코드의 버그에 대해서만 포인트를 부여하는 것입니다.
Cel Skeggs 2016 년


@ col6y 당신 말이 맞아요, 그것은 매우 중요합니다. 불행히도 여전히 시스템을 조작하는 방법이 있습니다. 예를 들어 코드에서 작업을 수행하기 위해 코드를 호출하면 코드에서 코드에 "사고"가 발생했음을 알 수 있습니다.
Mike Nakis

3
동의하지 않습니다. 단위 테스트는 새로 작성되었을 때 처음부터 버그를 찾기위한 것이 아닙니다 . 작성된 후 몇 주 또는 몇 달 후에 회귀를 찾을 수 있지만 경쟁에 유용한 지표를 제공하기에는 너무 늦었습니다. 일반적으로 나중에 특정 유형의 버그가 발생하지 않도록 특정 버그가 발생한 후에 단위 테스트를 작성합니다 .
Doc Brown
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.