단위 테스트 시간 초과를 사용하여 방법의 성능을 측정하는 것이 좋습니다? 소요 된 시간을

특정 조치에 대한 최대 실행 시간을 지정하는 비 기능 요구 사항 이있는 프로젝트에서 QA는 요구 사항에 지정된 하드웨어 및로드 모두에서 정확한로드 하에서 정밀한 하드웨어를 사용하여 전용 머신에서이 조치의 성능을 확인해야합니다.

반면에 소스 코드를 잘못 변경하면 성능에 심각한 영향을 줄 수 있습니다. 소스 코드가 소스 제어에 도달하고 QA 부서에서 확인 하기 전에 이러한 부정적인 영향을 조기 에 발견 하면 QA 부서에서 문제를보고하고 개발자가 나중에 여러 커밋을 수정하여 시간을 잃는 데 유리할 수 있습니다.

이렇게하려면 좋은 생각입니까?

  • 단위 테스트를 사용하여 동일한 조치를 실행하는 데 소요 된 시간을 n n 번 이해하려면,

  • C #의 속성을 통해 테스트 당 시간 초과 를 사용하려면 [TestMethod, Timeout(200)]?

이 접근법에는 몇 가지 문제가 있습니다.

  • 개념적 으로 단위 테스트는 실제로는 아닙니다. 기능 요구 사항 확인, 통합 테스트 또는 성능 테스트 등 코드의 작은 부분 만 테스트하면됩니다.

  • Visual Studio의 단위 테스트 시간 초과는 초기화 및 정리가 해당 테스트에 존재하지 않거나 결과에 영향을주기에는 너무 짧다는 점을 고려하여 실제로 측정 할 것으로 예상되는 것을 측정합니까?

  • 이런 식으로 성능을 측정하는 것은 추악합니다. 하드웨어,로드 등과 상관없이 모든 머신에서 벤치 마크를 실행하는 것은 하나의 데이터베이스 제품이 항상 다른 제품보다 빠르다는 벤치 마크수행하는 것과 같습니다 . 다른 한편으로, 나는 그 단위 테스트가 확실한 결과가 될 것이라고 기대하지 않으며 QA 부서에서 사용되는 것입니다 . 이러한 단위 테스트는 예상 성능에 대한 일반적인 아이디어를 제공 하고 본질적 으로 개발자에게 그의 마지막 수정 작업이 성능에 심각한 영향을 미쳤다는 것을 알리기 위해 사용됩니다 .

  • 이러한 테스트에는 TDD (Test Driven Development) 가 불가능합니다. 코드 구현을 시작하기 전에 어떻게 실패합니까?

  • 너무 많은 성능 테스트는 테스트 실행에 필요한 시간에 영향을 미치므로이 방법은 간단한 조치로만 제한됩니다.

이러한 문제를 고려할 때 QA 부서의 실제 성능 지표와 결합 된 경우 이러한 단위 테스트를 사용하는 것이 여전히 흥미 롭습니다.

내가 잘못? 이를 위해 단위 테스트를 사용할 수없는 다른 문제가 있습니까?

내가 틀렸다 면 소스 코드가 소스 제어에 도달하고 QA 부서에서 확인하기 전에 소스 코드의 변경이 성능에 심각하게 영향을 미쳤다는 것을 개발자에게 알리는 올바른 방법은 무엇 입니까?


¹ 실제로, 단위 테스트는 하드웨어 성능이 비슷한 개발자 PC에서만 실행되므로 성능 테스트에 실패 할 수없는 가장 빠른 기계와 통과하지 못한 가장 느린 기계 사이의 간격이 줄어 듭니다.

² 행동으로, 실행하는 데 몇 밀리 초가 걸리는 다소 짧은 코드 조각을 의미합니다.



답변

우리는이 접근법도 사용하고 있습니다. 즉, 주어진 머신에서 정의 된로드 시나리오 하에서 런타임을 측정하는 테스트가 있습니다. 우리는 이것을 일반적인 단위 테스트에 포함시키지 않는다는 것을 지적하는 것이 중요 할 수 있습니다. 단위 테스트는 기본적으로 변경 사항을 커밋하기 전에 개발자 컴퓨터의 각 개발자가 실행합니다. 이것이 성능 테스트에 적합하지 않은 이유는 아래를 참조하십시오 (적어도 우리의 경우). 대신 통합 테스트의 일부로 성능 테스트를 실행합니다.

확인을 배제해서는 안된다는 것을 올바르게 지적했습니다. 우리는 테스트가 작동하지 않는 요구 사항에 대한 테스트라고 가정하지 않습니다. 대신, 우리는 그것을 단지 잠재적 인 문제 지표라고 생각합니다.

나는 당신의 제품에 대해 확신하지 못하지만, 우리의 경우, 성능이 불충분하다면, 그 “고정”에 많은 작업이 필요하다는 것을 의미합니다. 우리가 이것을 QA에 전적으로 맡기는 처리 시간은 끔찍합니다. 또한 성능 수정 사항은 코드 기반의 상당 부분에 심각한 영향을 미쳐 이전 QA 작업이 무효화됩니다. 대체로 매우 비효율적이고 만족스럽지 못한 워크 플로입니다.

다음은 각 문제에 대한 몇 가지 사항입니다.

  • 개념적으로 : 이것은 단위 테스트에 관한 것이 아닙니다. 그러나 모든 사람이 알고있는 한, 테스트에서 QA가 수행해야 할 작업을 확인해서는 안된다는 것은 괜찮습니다.

  • Visual Studio : VS의 단위 테스트 프레임 워크를 사용하지 않으므로 이에 대해 아무 것도 말할 수 없습니다.

  • 기계 : 제품에 따라 다릅니다. 귀사의 제품이 개별 데스크탑 컴퓨터를 사용하여 최종 사용자를 위해 개발 된 제품인 경우에는 실제로 다른 개발자의 컴퓨터에서 테스트를 실행하는 것이 더 현실적입니다. 우리의 경우, 우리는 주어진 사양의 기계를 위해 제품을 제공하고 이러한 기계에서만 이러한 성능 테스트를 수행합니다. 실제로, 클라이언트가 궁극적으로 16 개 이상의 코어를 실행할 때 듀얼 코어 개발자 시스템의 성능을 측정하는 데 별다른 의미가 없습니다.

  • TDD : 초기 고장이 일반적이지만 반드시 그럴 필요는 없습니다. 실제로 이러한 테스트를 조기에 작성하면 기존 단위 테스트가 아닌 회귀 테스트의 역할을합니다. 테스트가 일찍 성공한다는 것은 문제가되지 않습니다. 그러나 개발자가 기능을 저하시키는 기능을 추가 할 때마다 비 기능적 성능 요구 사항을 알지 못했기 때문에이 TDD 테스트가이를 발견 할 수 있다는 이점을 얻습니다. 많은 일이 일어나고 멋진 피드백입니다. 일상 업무에서 코드를 작성하고 커밋하고 점심 식사를하고 다시 돌아 왔을 때 빌드 시스템은로드가 많은 환경에서 실행될 때이 코드가 너무 느리다고 알려줍니다. 그것은 TDD 테스트가 처음에 실패하지 않았다는 것을 받아들이기에 충분합니다.

  • 런타임 : 언급 한 바와 같이 개발자 시스템에서는 이러한 테스트를 실행하지 않고 일종의 통합 테스트에서 빌드 시스템의 일부로 실행합니다.


답변

나는 대부분 당신의 생각과 일치합니다. 독립적 인 흐름으로 내 추론을 견뎌내십시오.

1. 더 나은 / 빠른 만들기 전에 작동 시키십시오
. 코드가 성능 측정을 제공하기 전에 (단지 보장 할 필요는 없음) 먼저 수정 해야합니다 . 즉 기능적으로 작동해야합니다. 기능적으로 잘못된 코드 최적화는 시간 낭비 일뿐만 아니라 개발에 방해가됩니다.

2. 시스템 성능은 전체 시스템에서만
의미가 있습니다. 일반적으로 의미있는 성능은 항상 주어진 인프라에 따라 다르며 전체 시스템에서만 볼 수 있습니다. 예를 들어, 모의 테스트 중에 모듈이 로컬 텍스트 파일에서 응답을 수신하지만 프로덕션 환경에서는 이전의 데이터베이스에서 페치하는 경우

3. 성능 확장은 객관적으로 수행되어야합니다
. 기능 시스템이 있으면 시스템 성능을 분석하고 병목 현상을 찾아서 성능을 확장해야하는 위치 를 이해해야 합니다. 전체 시스템의 성능을 알기 전에도 모든 방법을 맹목적으로 최적화하려고하면 쓸모없는 작업이 발생할 수 있으며 (중요하지 않은 방법 최적화) 불필요하게 코드가 부풀려 질 수 있습니다.

Visual Studio 기능에 대해 잘 모르지만 일반적으로 더 광범위한 프로파일 링 도구가 필요합니다.


답변

나는 얼마 전에 비슷한 작업을 해왔고 최종 솔루션은 단위 테스트와 완전 자동화 된 성능 테스트 중간에있었습니다.

특별한 순서가 아닌 몇 가지 고려 사항은 유용 할 수 있습니다.

  • QA의 성능 테스트는 노동 집약적이며 자체 일정 (예 : 반복에서 한 번)을 가졌으므로 소스 제어를 누르는 것은 문제가되지 않았습니다.
  • 우리 시스템은 규모가 크고 모듈 식이며 단위 테스트는 우리의 요구에 비해 세분화되었으며, 관심있는 특정 영역에서 성능 문제를 유발할 수 있도록 특수한 “지방”단위 테스트를 신중하게 만들었습니다. 구현 세부 사항).
  • 단위 테스트에 대한 일반적인 제약 사항은 여전히 ​​적용됩니다. 그것들은 작고 빠르며 요점이어야합니다.
  • 테스트 프레임 워크 영향을 배제하기 위해 특수 래퍼에 의해 실행되었으므로 주어진 작업에 걸리는 시간을 정확히 알고있었습니다 .
  • 실제 구현이 완료되기 전에 그것들을 작성할 수 있습니다 (결과는 프로세스에 따라 관련이 없거나 유용 할 수 있습니다. 아마도 개발자가 구현을 실험하고 있으며 전반적인 진행 상황을보고 싶습니다).
  • 빌드 후에 CI 서버에서 실행 되었으므로 총 실행 시간을 상대적으로 짧게 유지해야합니다 (그렇지 않은 경우 문제를 유발 한 정확한 변경을 정확히 파악하기가 상당히 어려워집니다).
  • CI 서버는 강력하고 하드웨어가 고정되어 있으므로이를 전용 머신으로 계산했습니다 (원격 빌드 에이전트를 사용하여 실제로 전용 서버를 사용할 수 있음).
  • 테스트 래퍼는 모든 관련 정보 (하드웨어 사양, 테스트 이름 / 범주, 시스템로드, 경과 시간 등)를 수집하여 보고서 또는 데이터베이스로 내보냈습니다.
  • 우리는 JIRA가 보고서를 가져오고 이름 / 카테고리 / 빌드 번호로 컨트롤을 사용하여 멋진 차트를 작성했습니다. (일부 빨간색, 모두 녹색, 중요합니다).
  • 수집 된 통계를 사용하여 시간이 지남에 따라 프로젝트가 어떻게 진행되고 있는지 분석 할 수있었습니다.

결국, 우리는 확장 가능하고 유연하며 예측 가능한 시스템을 갖추고있어 특별한 요구 사항을 신속하게 조정할 수 있습니다. 그러나 구현하기 위해 약간의 노력이 필요했습니다.

질문으로 돌아 가기 개념적으로 단위 테스트는 그렇지 않지만 테스트 프레임 워크의 기능을 활용할 수 있습니다. 테스트 타임 아웃을 측정 수단으로 본 적이 없었습니다. 그러나 현재 접근 방식이 효과가 있다면 계속 사용하고 실용적입니다. 필요한 경우 언제든지 나중에 갈 수 있습니다.


답변

잘 지내고 있다고 생각합니다. 확인하는 일이 걸리는 경우이 정확히 단위 테스트 시간 제한을 가지고있는 포인트입니다 , 방법을 방법 이 있어야하는 것보다 더. 이 접근 방식에는 제한이 있지만 이미 알고있는 것 같습니다. 이러한 제한을 염두에두면 문제가 없습니다.