저는 BE (CS)에서 일하는 학생이며 질문은 다음과 같습니다.
- 소프트웨어 분야의 테스트가 필요합니까?
- 주의해서 소프트웨어를 만들면 왜 테스트해야합니까?
- 테스트 후 우리는 될 수 있는지 우리는 우리가 일 때문에이 목적 (의도 한대로 제품 / 소프트웨어 작품) 달성 한 것을 테스트 그것을 위해를? 가능합니까?
내 질문 : 소프트웨어 테스트가 필요 합니까?
저는 BE (CS)에서 일하는 학생이며 질문은 다음과 같습니다.
내 질문 : 소프트웨어 테스트가 필요 합니까?
답변:
예. 아무리 훌륭해도 모든 것을 생각할 수는 없습니다.
요리사가 요리하는 동안 음식을 맛보는 것과 같은 이유로.
나는 이런 생각을하는 사람과 함께 일한다. 그는 선임 프로그래머이기 때문에 더 이상 코드를 테스트 할 필요가 없다고 생각한다. 회사는 이러한 태도가 얼마나 위험한지 이해하지 못하고 그를 해고하는 대신 버그 백 로그를 해결하기 위해 더 많은 프로그래머를 고용했습니다. 이 백 로그의 출처를 알지 못하면 프로그래밍이 무엇인지에 대한 부분이라고 생각합니다. 기본적으로 우리는이 모드에서 작동하는 3 명의 프로그래머와 20 명의 팀이이 세 가지 버그를 테스트하고 수정하는 것 외에는 아무것도하지 않습니다.
그러므로 당신이 신이 아니거나 모든 것을 알고있는 완벽한 버전 (지금은 내가보고 싶은 것)이 아니거나 적극적으로 매우 빨리 해고하고 싶지 않다면 테스트를 시작하는 것이 좋습니다.
당신은 당신이 당신의 노트북에 사용하는 OS를 실행하고 좋아하는 색상으로 당신에게 죽음의 화면을 제공 비행을 타고 있습니까? 생각 해봐
완벽한 코더는 없습니다. 멀리, 멀리, 멀리 떨어져 있습니다. 테스트가 필요하며 테스터는 종종 개발자가 누락 한 관점 (사용 사례라고도 함)을 가져옵니다.
내가 의미하는 바를 알기 위해 Google에서 가장 유명한 소프트웨어 버그를 검색하십시오.
또한 대학 수준에서 테스트 중심 개발, 단위 테스트 및 민첩한 사례를 읽고 현재 상황을 파악하십시오.
오류가있는 Humanum est
버그가없는 소프트웨어는 없습니다.
가장 숙련 된 개발자는 버그가있는 코드를 작성합니다. 완벽한 개발자가 존재하더라도 다음과 같은 불일치로 인해 여전히 버그가 있습니다.
완벽한 개발자는 모든 것의 일부일뿐입니다. 완벽한 개발자는 존재하지 않습니다.
실제 프로그램의 대부분 :
a) 수많은 파일에 흩어져있는 수백 줄 이상의 코드를 포함합니다.
b) 둘 이상의 프로그래머가 개발 한 것;
c) 개발자 환경과 다른 환경에서 사용
따라서 실제 상황에서 프로그램이 작동하는 방식을 확인하지 않으면 전혀 작동하지 않을 확률은 100 %에 가깝습니다.
예.
아직 다루지 않은 약간 더 미묘한 관점이 있습니다.
"독립적 검증"의 필요성을 과소 평가하지 마십시오 . 출판을 위해 큰 글을 제출하기 전에 독립적 인 편집인 몇 명이 작업을 감독하는 것이 좋은 이유도 마찬가지입니다. 아무리 당신이 글을 쓰는 사람이 있더라도 가끔 뇌파를 치고 "it"대신에 "in"같은 것을 쓰십시오. 당신이 그것을 스스로, 심지어 아주 신중하게 다시 읽는다면, 당신의 두뇌는 자동적으로 사고 과정 흐름을 올바른 것으로 받아들이고 오류에 대한 광택을 갖기 때문에 여전히 그것을 놓칠 것입니다. 신선한 눈에는 이런 종류의 실수가 보통 눈부신 것입니다.
프로그래밍에서도 똑같은 결과를 얻을 수 있습니다. 코드 또는 자체 코드의 기본 "개발 테스트"중 하나를 테스트하는 과정은 매우 쉽습니다. 코드를 테스트하고 특정 방식으로 사용하기 때문에 정확 해 보입니다. 그러나 다른 한 쌍의 손이 와서 약간 다른 방식이나 순서로 물건을 클릭하면 모든 것이 무너집니다.
물론 이론적으로는 코드의 모든 단일 가능성과 논리 분기를 공식적으로 확인하는 경로를 내려갈 수 있지만 사소한 소프트웨어의 경우 다른 사람이 다른 사람을 공격하는 것보다 훨씬 비싸고 시간이 많이 걸립니다. 당신을위한 코드. 그리고 당신은 아마 당신이 생각하지 않은 것들을 그리워 할 것입니다.
숙제 질문 같은 냄새가납니다.
소프트웨어 분야의 테스트가 필요합니까?
예. 전혀. 모든 수준에서. 몇몇 특수한 도메인을 제외하고는 아직 특정 버그에 대해 코드가 정확 하다는 것을 수학적으로 증명할 수있는 단계에 있지 않습니다. 그것이 부서지는 곳.
주의해서 소프트웨어를 만들면 왜 테스트해야합니까?
테스트는 코딩 오류를 찾는 것이 아닙니다. 또한 모든 요구 사항을 충족하고 전체 시스템이 예상대로 작동하는지 확인해야합니다. 실패한 트랜잭션이 특정 오류 코드를 반환해야한다는 요구 사항이있는 경우 기능 이 존재 하고 올바르게 작동하는지 테스트하기 위해 테스트를 작성해야 합니다.
그리고 사양과 디자인이 완벽하고 정확하며 내부적으로 일관성이 있다고 가정하는 경우가 종종 있습니다. 문자에 대한 사양을 충족하고 마지막 점과 세미콜론까지 디자인을 따르더라도 사양이나 디자인이 나쁜 경우 통합시 문제가 발생합니다. 종종 시스템 또는 통합 테스트는 사양 자체가 버그가 있고 수정해야 함을 알게 될 때입니다 (아래의 전쟁 사례 참조).
테스트 후 테스트를 수행하여이 목표 (제품 / 소프트웨어가 의도 한대로 작동 함)를 달성했는지 확인할 수 있습니까? 가능합니까?
아니요, 100 %가 아닙니다. 우리는 가장 간단한 코드를 사용하여 가능한 모든 입력 또는 실행 경로 조합을 테스트 할 수 없습니다. 모든 환경 요인을 설명 할 수는 없습니다. 가능한 모든 실패 모드를 상상할 수는 없습니다.
우리는 합리적으로 테스트 할 수 있습니다 어떤 큰 문제가되지 않습니다 확인합니다. 다시, 이것이 우리가 모든 수준에서 테스트해야하는 이유입니다. 코드가 에지 조건 (잘못된 입력, 예기치 않은 결과, 예외 등)을 올바르게 처리하는지 테스트 세트를 작성하십시오. 코드가 요구 사항을 충족하는지 확인하기위한 단위 테스트. 엔드-투-엔드 처리를 검증하기위한 시스템 테스트. 모든 구성 요소가 서로 올바르게 통신하는지 확인하기위한 통합 테스트 유용성 테스트를 수행하여 고객이 당신을 쏘고 싶지 않은 방식으로 모든 것이 작동하는지 확인하십시오.
실제 시나리오-때때로 화면의 테이블에 표시하기 위해 GUI 서비스로 업데이트를 보내는 백엔드 시스템에서 작업하고있었습니다. 프로젝트 동안, 디스플레이에 필터링을 추가하기위한 요구 사항이 추가되었습니다 (예를 들어, 오퍼레이터는 테이블에서 엔트리의 서브 세트를 디스플레이하도록 선택할 수 있음). 디자인 실수 # 1-필터링 은 GUI 서비스 (디스플레이 관리 기능이 디스플레이 관리 소프트웨어의 책임이어야한다는이 고풍스럽고 골동품적인 개념을 가지고 있음)에 의해 수행되어야하지만 정치와 문제가 발생하기 전에 문제를 인식 할 수 없기 때문에 문제 는 백엔드 서비스에 적용되었습니다. 글쎄요, 문제 없습니다, 그렇게 할 수 있습니다. 상태 변경을 필터링하고 메시지를받은 다음에 대해 작성 또는 삭제 메시지를 보냅니다.인터페이스가 작동하는 방식이기 때문에 테이블의 각 행 (디자인 실수 # 2-단일 메시지에서 여러 행으로 업데이트를 보낼 수있는 방법이 없습니다. 하나의 "clear"또는 "delete"메시지를 보내서 지울 수도 없습니다. 전체 테이블).
글쎄, 개발하는 동안 모든 것이 잘 작동합니다. 단위, 시스템 및 통합 테스트에 따르면 올바른 정보를 전송하고 필터 변경 사항을 올바르게 처리합니다. 그런 다음 유용성 테스트를 수행하면 데이터 양이 압도적 이었기 때문에 모든 것이 어려워 집니다 . 백엔드 서비스와 GUI 간의 네트워크 대기 시간은 .15 ~ .25 초입니다. 열 개 정도의 업데이트 만 보내야한다면 나쁘지 않습니다. 수백 년 동안 업데이트를 보내야 할 때 치명적 입니다. 필터 상태를 변경 한 후 GUI가 정지되었다는 버그 보고서를 받기 시작했습니다. 글쎄, 아니, 무슨 일이 있었는지 몇 분 정도 걸리고 있었다 뼈를 향하고 갱신 한 행씩 메시지 프로토콜은 실제 시나리오를 처리 할 수 있기 때문에 디스플레이를 업데이트합니다.
그 모두가 가질 수 것을주의 해야 우리가 사전에 심지어 가장 기본적인 분석을 귀찮게했다면 모든 방법을 조금 오래된 저 아래로 계약자에서 모든 사람이 예상되고있다. 제가 제공 할 수있는 유일한 방어책은 6 개월간 2 개월 째 프로젝트가 마감 된 직후 배달이 끝나고 막혔다는 것입니다. 우리는 그 뒤를보기 위해 필사적이었습니다.
테스트해야 할 최종 이유 인 CYA가 있습니다. 실제 프로젝트는 여러 가지 이유로 실패합니다. 그 중 다수는 정치적입니다. 일이 잘못 될 때 모든 사람이 선의로 행동하는 것은 아닙니다. 손가락 비난했다 얻을, 뾰족한 수, 하루의 끝에서 당신은 적어도 보여주는 기록에 지점 수 있어야합니다 당신 이로했는데으로 물건을했다.
좋은 내결함성 컴퓨팅 과정을 수강하는 것이 좋습니다. 소프트웨어의 신중한 디자인은 소프트웨어 제품의 견고성을 달성하는 데 필요한 기둥 중 하나 일뿐입니다. 다른 두 기둥은 충분한 테스트와 중복 설계입니다. 기본적인 의도는 기하 급수적 인 수의 알려지지 않은 실패 조건을 수용하고 알려진 문제점 중 일부를 우선적으로 처리하는 것입니다.
1.) 설계 및 적절한 구현을 통해 가능한 많은 실패를 제거합니다. 2.) 다양한 형태의 테스트 (단위, 통합, 임의)를 통해 설계 단계에서 예상치 못한 실패를 제거하고 잘못된 구현을 수행합니다. 3.) 이중화 ( 일시적 => 재 계산, 재시도 또는 공간 => 사본, 패리티 유지)
테스트 단계를 제거하면 장애 해결을위한 설계 및 중복 단계 만 남게됩니다.
또한 제품의 관점에서 이해 관계자 (예 : 경영진, 사용자, 투자자)는 제품이 특정 품질 및 안전 사양, 기준 등을 충족한다는 일종의 보증을 원할 것입니다.이 외에도, 소프트웨어를 테스트하지 않은 경우 당신은 단지 '위생 확인'을 갖도록 구성 했습니까? 이러한 모든 이유 때문에 소프트웨어 테스트가 더욱 강력 해집니다.
모든 프로그램에는 최소한 버그가 있습니다.
5 줄의 테스트되지 않은 코드 당 약 1 개의 버그에 대한 연구가있었습니다.
역사 수업 :
1960 년대에 IBM은 실제로 프로그램을 실행하지 않고 JCL에서 일부 기능을 실행할 수 있도록 "NOP"프로그램이 필요했습니다. 개발자들은 전체 코드가 "IEFBR14"라는 이름에 포함 된 한 줄 어셈블러 프로그램을 만들었습니다. 실제 코드는 다음과 같습니다.
BR 14 * brach to return address in register 14
오랜 기간 동안이 한 줄 프로그램은 2 개의 버그 보고서와 5 개의 수정안이 적용되었습니다.
질문 # 3 에 답하려면 :
프로그래머와 소프트웨어 테스터 였으므로 테스트하는 동안 소프트웨어의 요구 사항을 충족하는지 확인할 수 있습니다.
{QA 모자 착용}
방법? 테스트 코드에서 승인 기준, 승인 기준, 기능 및 기능, 요구 사항에 이르기까지 테스트를 추적하여이를 수행 할 수 있습니다. 설계 체인에서 모든 단일 테스트를 추적하고 하나 이상의 요구 사항에 매핑하는 경우 코드가 요구 사항을 충족하는지 확인하기 위해 테스트를 사용하고 있는지 확인할 수 있습니다. 다른 주제). 디자인 체인에서 테스트를 추적 할 수없는 경우 필요하지 않은 항목을 테스트 할 가능성이 있으며 이는 시간 낭비입니다. 수락 기준에는 원하지 않는 동작 확인도 포함될 수 있습니다. 이러한 기능도 테스트하여 품질 릴리스에 한 걸음 더 다가 갈 수 있습니다.
{QA 모자 오프}
개발 과정에서 품질을 평가하는 데 더 많은 노력을 기울이면 시간이 지남에 따라 코드가 버그없이 처리되지 않습니다.
저는 3 년 동안 소프트웨어 테스터였습니다. 처음에는 개발 부서와 프로젝트 관리 부서가 업무를 수행하면 소프트웨어에 실수가 발생하지 않는다고 생각했기 때문에 테스트 필요성에 대해 회의적이었습니다.
그러나 이것은 사실이 아닙니다. ++++++++
실수는 종종 발생하며, 그 중 일부는 프로젝트 운영에 중요합니다. 또한 브라우저 간 테스트 (SAFARI, FIREFOX, CHROME 및 Internet Explorer와 같은 다른 기존 브라우저에서 테스트하는 것을 의미 함)가 있으며 모든 브라우저에서만 작동하지 않는 설문 조사 창에서 YES 및 NO와 같은 간단한 인터페이스 버튼이있는 프로젝트에서 작업했습니다. 그들 중 일부.
나는 인터넷 페이지 테스트에서 일했고 간단한 텍스트 변경을 테스트하고 있었고 지구상 에서이 간단한 작업에 결함이있을 수는 없다고 생각했지만 아무 일도 일어나지 않았습니다.
또한 새로운 개발자가 팀에 합류하고 외부 페이지에 대한 많은 연결 / 호출과 함께 기존의 복잡한 인터넷 응용 프로그램 양식에 대한 업데이트 작업이 제공되는 것을 보았습니다. 오래된 개발자와 새로운 개발자 간의 의사 소통 부족으로 인해 실수가 발생했습니다. 다양한 이유로 (교육 할 시간이없고, 교육 할 의지가없는 등).
예
소프트웨어가 논리 함수 AND (b1, b2)이고 b1과 b2가 비트 일 뿐이라고 상상해보십시오. 이를 통해 주변 환경이 지정된 것을 정확하게 제공하는 경우 소프트웨어에 오류가 없는지 확인하기 위해 4 가지 테스트 사례가 필요합니다.
이제 여러분의 시스템은 가장 간단한 기능이 논리 기능보다 훨씬 복잡한 많은 기능으로 구성됩니다. 오류가 없는지 어떻게 확인 하시겠습니까?
(계속)
If we create a software with care in during its development period then why should we go for Test?
-가장 숙련 된 프로그래머조차도 실수를 저지르기 때문입니다.