과학 컴퓨팅 라이브러리의 단위 테스트


15

나는 고전적인 소프트웨어 엔지니어링 프로젝트 (MVC), 사용자 GUI, 데이터베이스, 중간 계층의 비즈니스 로직 등 MVC와 같은 단위 테스트에 대해 약간의 경험을 가지고 있습니다. 저는 C #에서 과학 컴퓨팅 라이브러리를 작성하고 있습니다 (예, C #이 너무 느리다는 것을 알고 C를 사용하고 바퀴를 재발 명하지 마십시오. 그러나 C #의 교수진에서 과학 계산을하는 많은 사람들이 있습니다. 필요합니다). 소프트웨어 개발 산업 측면에서 볼 때 소규모 프로젝트입니다. 나는 주로 혼자서 작성하고 있기 때문에 때때로 몇몇 동료의 도움을 받아 작성하기 때문입니다. 또한, 나는 그것을 지불하지 않으며, 가장 중요한 것은 학업 프로젝트입니다. 오픈 소스를 계획하고 있기 때문에 언젠가는 전문적인 품질을 기대합니다.

어쨌든, 프로젝트는 커지고 있고 (한 사람의 프로젝트에는 큰 18,000 줄의 코드), 내 손에서 벗어나고 있습니다. 소스 제어를 위해 git을 사용하고 있는데 꽤 괜찮은 것 같지만 구식과 같은 테스트를하고 있습니다. 시스템의 큰 부분을 테스트하는 전체 콘솔 응용 프로그램을 작성하는 것은 주로 방법을 모릅니다. 이 시나리오에서 단위 테스트를 수행해야하지만 그렇게해야한다고 생각합니다. 문제는 라이브러리에 주로 알고리즘, 예를 들어 그래프 알고리즘, 분류 자, 수치 솔버, 랜덤 분포 등이 포함되어 있다는 것입니다. 각 알고리즘에 대해 작은 테스트 사례를 지정하는 방법을 모르겠습니다. 확률론 나는 정확성을 검증하는 방법을 모른다. 예를 들어 분류의 경우 정밀도 및 회수와 같은 측정 항목이 있습니다. 그러나 이러한 메트릭은 단일 알고리즘을 판단하는 것보다 두 알고리즘을 비교하는 것이 좋습니다. 그렇다면 여기서 정확성을 어떻게 정의 할 수 있습니까?

마지막으로 성능 문제도 있습니다. 나는 완전히 다른 테스트 세트를 알고 있지만 성능은 사용자 만족도 또는 다른 소프트웨어 엔지니어링 메트릭이 아니라 과학 도구의 중요한 기능 중 하나입니다.

내 가장 큰 문제 중 하나는 데이터 구조입니다. kd-tree에 올 수있는 유일한 테스트는 스트레스 테스트입니다. 많은 임의의 벡터를 삽입하고 많은 임의의 쿼리를 수행하고 순진 선형 검색과 비교하십시오. 성능도 동일합니다. 그리고 수치 최적화 도구를 사용하면 테스트 할 수있는 벤치 마크 기능이 있지만 스트레스 테스트입니다. 나는 이러한 테스트가 단위 테스트로 분류 될 수 있다고 생각하지 않으며, 가장 중요한 것은 대부분 무겁기 때문에 계속 실행됩니다. 그러나 나는 또한 이러한 테스트를 수행해야한다고 생각합니다. 두 요소를 삽입하고 루트를 팝 할 수 없으며 예를 들어 0-1-n 경우에 작동합니다.

그렇다면 이러한 종류의 소프트웨어에 대한 (단위) 테스트 방법은 무엇입니까? 그리고 코드 빌드 커밋 통합주기에 대한 단위 테스트와 무거운 테스트를 어떻게 구성합니까?

답변:


19

과학 컴퓨팅은 실제로 단위 테스트에 매우 적합하다고 말하고 싶습니다. 명확한 입력 및 출력, 명확하게 정의 된 사전 및 사후 조건이 있으며 이는 디자이너의 변덕에 따라 격주로 변경되지 않으며 테스트하기 어려운 UI 요구 사항이 없습니다.

문제를 일으킬 수있는 몇 가지 요소의 이름을 지정합니다. 그들에 대해 어떻게해야합니까?

  • 무작위 알고리즘 : 두 가지 가능성이 있습니다. 무작위 배정 자체를 실제로 테스트하려면 많은 반복 횟수를 예약하고 예상되는 비율의 비율이 원하는 기준을 충족하는지 확인하고 허위 테스트 실패는 매우 드물게 발생합니다. (신뢰 적 신호가 버그를 환영하는 테스트 스위트는 많은 모든 가능한 결함을 포착하지 못하는 보다 나쁩니다.) 또는 구성 가능한 임의 소스를 사용하고 시스템 클록 (또는 사용하는 모든 것)을 종속성을 통해 결정적인 소스로 교체하십시오. 테스트를 완전히 예측할 수 있도록 주입합니다.
  • 정밀도 / 호출의 관점에서만 정의 된 알고리즘 : 아무것도 입력하지 않고 전체 입력 케이스를 설정하고 정밀도를 측정하고 호출하는 것을 막을 수 없습니다. 테스트 데이터를 제공하는 것이 생산성의 병목 현상이되지 않도록 이러한 테스트 사례를 반자동으로 효율적으로 생성하는 것입니다. 대안 적으로, 신중하게 선택된 입력 / 출력 쌍을 지정 하고 루틴이 충분히 예측 가능한 경우 알고리즘 이 원하는 입력을 정확하게 계산한다고 주장 할 수도 있습니다.
  • 비 기능적 요구 사항 : 지정이 정말 명시 적 공간 / 시간 요구 사항을 제공하는 경우에, 당신은 기본적으로 입력 / 출력 쌍 전체 스위트를 실행하고 그 자원 사용 부합 함을 선언을 확인하기 위해 필요한 사용 패턴에. 여기서 트릭은 자신의 테스트 클래스를 먼저 교정하여 측정하기에 너무 빠르거나 테스트 스위트를 실행하는 것이 실용적이지 않을 정도로 오래 걸리는 다른 크기의 10 가지 문제를 측정하지 않도록하는 것입니다. PU가 실행되는 속도에 따라 크기가 다른 테스트 사례를 생성하는 소규모 사용 사례 생성기를 작성할 수도 있습니다.
  • 빠른 테스트와 느린 테스트 : 단위 테스트이든 통합 테스트이든, 종종 매우 빠른 테스트와 매우 느린 테스트로 끝납니다. 테스트를 정기적으로 실행하는 것은 매우 가치가 있기 때문에, 나는 일반적으로 실용적인 경로로 가서 내가 가지고있는 모든 것을 빠르고 느린 스위트로 분리하여, 빠른 것이 가능한 한 자주 (확실히 모든 커밋 전에) 실행될 수 있도록하고, '의미 적으로'두 가지 테스트가 함께 속해 있는지 여부입니다.

+1. 감사합니다. 대답에 통찰력이 있으면 많이 있습니다. 몇 가지 질문 : 메타 휴리스틱과 같은 최적화 알고리즘은 어떻습니까? 벤치 마크 함수가 많이 있지만 두 가지 알고리즘을 비교하기 만하면됩니다. 벤치 마크 알고리즘도 찾아야합니까? 유전자 알고리즘이 정확하다는 것은 무엇을 의미합니까? 그리고 재조합 및 돌연변이 유형과 같은 각 "매개 변수"전략을 어떻게 테스트합니까?
Alejandro Piad

1
메타 휴리스틱의 경우 몇 가지 특징적인 I / O 쌍, 즉 루틴의 "유명한 성공"을 선택하고이 방법 (또는 둘 중 더 나은 방법)이 실제로이 솔루션을 찾는 지 확인합니다. 잘 작동하는 "체리 피킹 (Cherry-picking)"문제는 당연히 최적화 연구에서 전혀 문제가되지 않지만 소프트웨어 테스트에는 문제가되지 않습니다. 알고리즘의 품질을 주장하는 것이 아니라 정확한 구현 만하는 것입니다. 그것이 당신이 증명할 수있는 유일한 "정확성"입니다. 매개 변수를 곱할 수있는 곱셈 루틴에 관해서는 : 예, 조합 테스트를 요구하는 것이 두렵습니다 ...
Kilian Foth

그렇다면 모든 올바른 구현이 정확하게 해결해야하는 간단한 벤치 마크를 설계하는 것과 같은가? 알고리즘의 품질을 증명할 수있는 방법이 있습니까? 나는 품질 표준을 대부분 정의 할 수 없다는 것을 알고 있지만 최소한 달성 된 품질을 낮추지 않는 변화를 원하지 않을 수 있습니까?
Alejandro Piad
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.