단위 테스트 및 테스트 중심 개발을위한 전략


16

저는 과학 컴퓨팅의 테스트 중심 개발을 대변하는 사람입니다. 실제로 유틸리티는 놀랍습니다. 코드 개발자가 알고있는 고전적인 문제를 실제로 완화합니다. 그러나 일반적인 프로그래밍에서는 발생하지 않는 과학 코드를 테스트하는 데 고유 한 어려움이 있으므로 TDD 텍스트는 자습서로 그리 유용하지 않습니다. 예를 들면 다음과 같습니다.

  • 일반적으로 주어진 복잡한 문제에 대한 정확한 답을 선험적으로 알지 못하므로 어떻게 시험을 작성할 수 있습니까?

  • 병렬 처리 수준이 변경됩니다. 최근에 3의 배수로 MPI 작업을 사용하는 것이 실패하지만 2의 배수가 작동하는 버그가 발생했습니다. 또한 일반적인 테스트 프레임 워크는 MPI의 특성으로 인해 MPI에 적합하지 않은 것으로 보입니다. 작업 수를 변경하려면 테스트 바이너리를 다시 실행해야합니다.

  • 과학 코드는 종종 밀접하게 결합되고 상호 의존적이며 상호 교환 가능한 부품이 많이 있습니다. 우리는 모두 레거시 코드를 보았고, 좋은 디자인을 포기하고 전역 변수를 사용하려는 유혹을 알고 있습니다.

  • 수치적인 방법은 종종 "실험"일 수도 있고, 코더가 어떻게 작동하는지 완전히 이해하지 못하고 이해하려고하기 때문에 결과를 예측하는 것은 불가능합니다.

과학 코드를 위해 작성한 테스트의 예 :

  • 시간 적분기의 경우 정확한 솔루션과 함께 간단한 ODE를 사용하고 적분기가 주어진 정확도 내에서이를 해결하는지 테스트하고 다양한 단계 크기로 테스트하여 정확도 순서가 올바른지 확인하십시오.

  • 제로 안정성 테스트 : 경계 / 초기 조건이 0 인 방법이 0으로 유지되는지 확인하십시오.

  • 보간 테스트 : 선형 함수가 주어지면 보간이 올바른지 확인합니다.

  • 레거시 유효성 검사 : 올바른 것으로 알려진 레거시 응용 프로그램에서 코드 청크를 격리하고 테스트에 사용할 일부 불연속 값을 가져옵니다.

수동 시행 착오를 제외하고 주어진 코드 덩어리를 올바르게 테스트하는 방법을 알 수없는 경우가 종종 있습니다. 숫자 코드로 작성하는 테스트 및 / 또는 과학 소프트웨어 테스트를위한 일반적인 전략의 예를 제공 할 수 있습니까?


보간 테스트의 의미를 명확하게 설명해 주시겠습니까?
Dmitry Kabanov 2016 년

답변:


8

제조 된 솔루션의 방법 .

이 방법이 이론적 인 정확도의 순서를 달성했음을 정제 연구를 통해 검증하십시오.

답변 보존. 솔루션의 비트 단위 및 표준 방식의 재생산.


원래 게시물에서 MMS를 언급하려고했습니다. 코드 검증에는 좋지만 단위 테스트 관점에서는 완전히 가치가 없습니다. 이러한 테스트가 실패하면 어디에서 왜 그런지에 대한 실마리가 없습니다.
Aurelius

3
@Aurelius : 그러나 테스트 중심 개발을위한 훌륭한 전략입니다! PDE / ODE / 선형 대수 코드의 경우 1 초 이내에 실행할 수있는 매우 작은 MMS 테스트를 작성해야합니다 . 변경하면 실행합니다. 그들이 깨지면, 당신은 뭔가 잘못한 것입니다! 요소 문제가 당신에게 (또는 무엇이든) 말할 수 있는 정도에 놀랄 것 입니다. 2×2×2
Bill Barth

내가 MMS에서 본 많은 문헌은 기본적으로 글로벌 솔루션입니다. 예를 들어 CFD 문제의 경우 제조 된 솔루션은 에어 포일 분석 일 수 있습니다. 이 테스트가 실패하면 기껏해야 범인을 5,000 줄로 좁혔으므로 TDD에는 아무런 가치가 없습니다. 실제 실패가 어디인지는 알 수 없습니다. 2x2x2 문제가 매우 중요하다는 데 동의하며 개인적으로 많이 사용합니다. 그러나 더 큰 시스템에서만 발생하는 문제가 발생하는 것이 일반적입니다. 실제로 큰 문제에서만 나타나는 ifort 컴파일러 버그를 최근에 발견했습니다.
Aurelius

@ 아우렐리우스 : 여기에 논쟁이 없습니다. 다양한 테스트를 수행하고 모두 자주 실행해야합니다.
Bill Barth

@Aurelius 액면가에서 MMS는 단위 테스트가 아니라 기능 또는 합격 테스트 (즉, 전체 시스템)입니다. 그러나 코드에는 종종 별도의 단계가 있습니다 (또는 여러 단계로 나눌 수 있음). 예를 들어, 이류, 압력, 점도. 그런 다음이 단계 중 하나 ( "단위") 만 테스트 할 수 있습니다. 마찬가지로 코드는 BC없이 테스트 한 다음 코드로 테스트 할 수 있습니다. 친구가 단위 테스트에서 박사 학위를 받았는데, 프로그램을 단위로 나눌 있다는 것이 가장 큰 이점이라고 생각했습니다. 그래서 단위 테스트를 할 수 있습니다. 내가 알지 못하는 다른 방법으로).
hyperpallium

6

Bill은 이미 우려 사항을 해결하는 몇 가지 방법을 나열했습니다.

세 번째 요점을 언급하면 ​​부품간에 강한 결합을 도입 할 이유가 없습니다. 함수 또는 클래스에 인터페이스가 잘 정의되어 있으면 선형 솔버를 다른 솔버로 바꾸거나 시간 단계 체계를 쉽게 교환 할 수 있습니다. 저항하기 만하면 이러한 구성 요소를 개별적으로 테스트 할 수 있습니다. 우리는 이것을 거래 .II와 함께 수십 년 동안 해왔습니다.

네 번째 요점으로 : 방법이 실험 인 경우 방법을 사용한 실험이 테스트를 구성합니다. 분석이없는 한이 테스트 결과를 최대한 활용해야합니다. 그러나 일반적으로 방법의 순서에 대한 기대가 있거나 특정 클래스의 솔루션, 예를 들어 특정 범위의 다항식에 대해 정확한지 알 수 있습니다. 이를 확인하는 것은 실험의 일부 여야하며 분석이 향상되면 테스트를 추가 할 수 있습니다.


1
Guido의 답변에 덧붙이 자면, 그가 경험 한 경험은 거래마다 실행되는 ~ 3,000 개의 테스트로 인코딩됩니다 .II는 모든 변경 후 : dealii.org/developer/development/… . 정확한 답을 모른다면 어떻게해야하는지에 대한 질문 : 어쨌든 시험을 작성하여 오늘의 답을 어제 (또는 시험을 쓸 때마다) 답과 비교하도록하십시오. 코드 출력에서 변경 사항 을 발견 할 수있는 방법을 사용 하면 응답이 잘못되었는지 또는 이전에 잘못 수정한지 여부를 모르더라도 유용합니다.
Wolfgang Bangerth

3

나는 최근 전산 과학에서 TDD에 관한 논문을 발견했다. 나는 그것을 아직 읽지 않았으므로 그것이 좋은지 전혀 모른다.하지만 희망이 있으면 도움이 될 수 있기를 바란다.

http://cyber.ua.edu/files/2014/12/u0015_0000001_0001551.pdf


1
나는 소개와 결론 중 일부를 훑어 보았고 표준 PhD 논문과 동등한 품질 수준을 가정 할 때,이 과정은 프로세스를 (높은 수준으로) 설명하고 그 효과에 대한 실제 측정 값을 제공합니다. 나는 이것이 꽤 찾을 것이라고 생각한다.
Godric Seer 2016 년

연결이 끊어졌습니다. Nanthaamornphong, A.“계산 과학 및 엔지니어링 소프트웨어 개발에서 테스트 중심 개발 및 리팩토링 기술의 효과”를 의미합니까? 박사 학위, Uni. 앨라배마 (2014).
AlQuemist
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.