Why Software Test
사례 1. 737 맥스 보잉사
기체의 속도가 떨어지면 강제로 아래로 맞춰주는 소프트웨어가 있었다. 하지만, 센서가 오동작했을 때의 대비책을 만들어지지 않아 소프트웨어가 강제로 아래로 내리는 바람에 충돌하는 사고가 있었다. 예외적인 부분에 대해 모든 것을 테스트했어야 하는데, 이를 고려하지 않고 갔기에 발생한 사건이다.
잘못된 소프트웨어 하나가 인명 피해까지 발생시킨다.
Cost to fix a defect
테스트에 대한 중요도는 나날이 증가했고, 이제는 거의 필수적이다. 얼마나 빨리 이것에 공감하고 여러분의 코드에 얼마나 큰 영향을 미치는지 이해하게 된다면, 여러분들의 가치는 달라지게 된다. 신입 사원 인터뷰에도 중요한 문제로 불린다.
What is Software Test
A process of analyzing a software item to detect the differences between existing and required conditions (i.e., defects) and to evaluate the features of the software item.
종류
대략 10가지로 분류되지만, 여러분들이 실제로 하게 될 테스트는 6개 정도이다.
- Unit Testing - 코드 한 줄 한 줄이 잘 동작되는지 테스트
- Integration Testing - 두 개의 다른 분리된 시스템끼리 잘 통신하고 있는지 테스트
- Functional Testing
- System Testing
- Stress Testing
- Performance Testing - 소프트웨어가 얼마나 많은 사용자를 감당할 수 있는지 테스트
- Usability, Acceptance, Regression, Beta Testing
Unit Test
Test to verify a function(method) or a specific logic in the function.
Why
맞게 짠 것 같은데 틀린 경우, 틀리게 짠 것 같은데 맞는 경우에 정말 애매해진다. 휴가를 갔다 오거나 잠시 다른 일을 하고 오면, 코드에 대한 의심이 생기게 된다. 하지만, 테스트 코드를 작성해 두었다면 '기존의 로직은 이렇게 돌아야 한다' 등 다시 remind 하기 쉽게 된다.
개발은 혼자 하는 것이 아니다. 동료와 같이 협업하게 된다. 각자가 자신의 부분을 코딩하게 될 것인데, 다른 동료가 내 코드와 함께 합칠 때 내 코드(로직)에 대한 테스트 코드를 작성해 두었다면, 내 코드를 보호할 수 있다. Shield of my codes. Protects my logics from external changes.
테스트 코드가 깨지면 Reviewing에 들어간다.
Why not
실제 현업에서는 Unit test를 잘 사용하지 않는다.
- I don't have ENOUGH time to write tests. Very BUSY!
- I'm PERFECT. I don't need surplus like TESTS.
- Every changes cause BROKEN tests. Should I repeatedly fix them?
- I have no idea. (don't know)
JUnit 5
java 쪽의 거의 표준화된 unit test 툴
JUnit can run specific tests, not application. 특정 영역의 코드 부분만 발췌해서 검증한다.
assertThat
- Hamcrest mathcers
- Verify the target condition in the readable statement.
Test naming
- Long descriptive name is good. Do not make it simple and short.
- Be specific.
- Korean is ok, but English is preferred for your future.
MethodName_StateUnderTest_ExpectedBehavior
- isAdult_AgeLessThan18_False
- withdrawMoney_InvalidAccount_ExceptionThrown
- admitStudent_MissingMandatoryFields_FailToAdmit
How to
Fast - Run fast and fail fast.
Isolated - No configurations, no dependencies.
Repeatable - Same result regardless of # of runs.
Self Validating - True or false, no gray zone.
Timely - Code tests and run tests when you are coding.
TDD
Test Driven Development
TDD will severely reduce the "fear of change".
요구사항을 테스트로 명확하게 기술해놓고, 메인 코드를 채워나가는 부분.
단계
- RED: Write a failing unit test
- GREEN: Write production code to make test pass
- REFACTOR: Remove duplication and improve design
이 사이클을 무한적으로 반복하는 것이 TDD이다.
"Making testable codes" draws the awesome design incrementally.
Good Coding Practices
- Write codes with your hands.
- Keep it simple.
- Write tests whatever you are coding.
- Follow the common standards.
- Share your code with others and review theirs as well.
- iterator도 i로 하지 마라. 알파벳 하나의 변수명은 쓰지 마라.
Q&A
Q. 많이 사용되는 UI 자동화 툴이 있나요?
A. 보통 웹이나 윈도우 환경에서는 셀레니움을 사용한다.
Q. 팀 규모에 따른 현실적인 TDD 스코프
A. 보통 적절한 팀의 규모는 4~6명이다.
Q. 최대한 빠른 기간 안에 프로젝트를 완성해야 하는 경우에도 TDD 방법론이 유효한가요?
A. 전통적인 TDD 방법을 사용하게 되면 1.2~1.3배의 시간이 소모된다. 프로젝트를 한 번 하고 버릴 거면 테스트를 많이 쓰지 않는다. (그럴 경우 규모 자체가 작을 것이다.) 그런 경우를 제외하고는 전부 TDD를 사용한다.
Q. 현업에서 실제로 TDD를 지켜가며 개발이 진행되나요?
A. 팀원 중에 한 명이라도 TDD를 잘 모르거나 한다면 진행이 매우 어렵다. 오늘 강의에서 알려준 내용들은 semantic 한 내용들이 많으나 추가적인 공부가 필수적이다.
Q. 게임 제작에서 가장 중요한 마인드/자세가 무엇이라고 생각하나요?
A. 게임을 플레이하는 고객 입장에서 재미있게 게임할 수 있겠나 등으로 생각한다. 사람마다 관점이 다르다.
Q. 다른 개발자들과 협업할 때 중요하게 생각하는 점?
A. 개발을 떠나서 상대방에 대한 이해가 담보되었을 때 제일 잘 된다. 코드 잘 짜는 사람들만 모아둔다고 제일 잘되는 것 아니다. 나도 그 사람을 알아야 하고 그 사람도 나를 알아야 한다.
Q. 취업할 때 제일 도움되었던 스펙이 무엇인가요?
A. 신입 개발자로서 가장 준비해야 하는 것은 학부생 때 배운 가장 기본적인 CS 지식을 확실하게 알아야 한다. 특히 네트워크와 OS를 잘 알아야 한다.
Q. 인공지능 영역을 뽑는다면 어떤 부분에 대한 준비가 취업에 도움이 될까요?
A. 선형대수, 학률 및 통계, 물리학, 철학을 꼭 공부하시기를 당부드린다. 그리고 AI 쪽은 프로그래밍 관련해서는 이미 한계점에 다달았다고 판단한다. 수학과 데이터 분석 쪽을 잘 분석해야 할 것이다.
참조
코딩엑스 - 라이엇게임즈와 함께하는 실전코딩 2차
'CS' 카테고리의 다른 글
HTTPS, SSL를 쉽게 알아보자 (천천히 읽으면 누구나 이해가능한,) (0) | 2022.05.22 |
---|---|
Elastic Stack: Elasticsearch, Kibana, Beats, Logstash (0) | 2022.05.07 |
influxDB란 (0) | 2021.09.05 |
Machine Learning Basic (0) | 2021.07.15 |
모바일 앱 (0) | 2021.06.23 |