Linux 시니어 테스트·코드품질 기술면접

Linux 시니어 (7년+) 테스트 · 코드품질 5문항 조회수 26 · 2026-08-04 (화) 14:17:41
1 시스템 테스트 전략
Hard

Q. Linux 커널 모듈이나 디바이스 드라이버를 개발할 때 단위 테스트와 통합 테스트 전략을 어떻게 수립하시겠습니까? 커널 공간 코드의 특수성을 고려하여 테스트 환경 구성과 테스트 방법론을 설명해주세요.

유저 공간과 커널 공간의 차이, 그리고 격리된 테스트 환경 구성 방법을 생각해보세요.

A. 모범답안

커널 모듈 테스트는 KUnit 프레임워크를 활용한 단위 테스트와 QEMU/KVM 기반 가상화 환경에서의 통합 테스트로 구분합니다. 단위 테스트는 KUnit을 사용해 커널 함수의 로직을 격리하여 테스트하고, mock 객체로 하드웨어 의존성을 제거합니다. 통합 테스트는 QEMU 가상 머신에서 실제 커널을 부팅하고 모듈을 로드하여 end-to-end 시나리오를 검증합니다. CI/CD 파이프라인에서는 빌드봇이나 kernelCI를 활용해 다양한 커널 버전과 아키텍처에서 자동 테스트를 수행합니다. 크래시 발생 시 kdump와 crash 유틸리티로 메모리 덤프를 분석하고, ftrace와 kprobe로 런타임 동작을 추적합니다. 성능 테스트는 perf와 BPF 기반 도구로 오버헤드를 측정하고 병목 지점을 식별합니다.

핵심 포인트
  • • KUnit 프레임워크를 활용한 커널 공간 단위 테스트
  • • QEMU/KVM 기반 격리된 통합 테스트 환경 구성
  • • kernelCI와 자동화된 다중 아키텍처 테스트
  • • ftrace, kprobe, BPF를 활용한 런타임 검증
답변에 넣으면 좋은 키워드
KUnit QEMU kernelCI ftrace kprobe kdump BPF
실무에서는

커널 모듈 배포 전 다양한 하드웨어 환경에서 안정성을 검증하고 리그레션을 방지하는 상황

Follow-up 질문

실제 하드웨어 의존성이 있는 디바이스 드라이버의 경우, 하드웨어 없이 테스트할 수 있는 방법은 무엇이 있을까요?

2 쉘 스크립트 코드 품질
Medium

Q. 대규모 인프라를 관리하는 Bash 스크립트의 코드 품질을 보장하기 위한 정적 분석 도구와 테스트 프레임워크를 소개하고, 팀 내에서 스크립트 코드 리뷰 시 중점적으로 확인해야 할 체크리스트를 제시해주세요.

ShellCheck 같은 도구와 함께 에러 핸들링, 멱등성 등의 원칙을 고려해보세요.

A. 모범답안

ShellCheck를 CI 파이프라인에 통합하여 문법 오류, 안티패턴, 보안 취약점을 자동으로 검출합니다. 테스트는 bats-core(Bash Automated Testing System)나 shunit2 프레임워크를 사용하여 단위 테스트를 작성하고, 함수 단위로 격리하여 테스트 가능하도록 모듈화합니다. 코드 리뷰에서는 set -euo pipefail 사용 여부, 변수 인용 처리, 에러 핸들링(trap 활용), 멱등성 보장, 하드코딩된 경로 회피를 확인합니다. 또한 shellformat이나 shfmt로 일관된 코드 스타일을 유지하고, 민감 정보는 환경 변수나 vault로 관리하는지 검토합니다. 복잡한 로직은 주석과 함수 분리로 가독성을 확보하고, 로깅은 syslog나 structured logging을 활용합니다.

핵심 포인트
  • • ShellCheck 정적 분석과 bats-core 테스트 프레임워크 활용
  • • set -euo pipefail과 적절한 에러 핸들링 검증
  • • 멱등성, 변수 인용, 하드코딩 회피 등 코드 리뷰 체크리스트
  • • 함수 단위 모듈화와 테스트 가능한 구조 설계
답변에 넣으면 좋은 키워드
ShellCheck bats-core set -euo pipefail 멱등성 trap shfmt
실무에서는

프로비저닝, 배포, 백업 자동화 스크립트의 품질 문제로 인한 대규모 장애를 예방하는 상황

Follow-up 질문

수천 개의 서버에 배포되는 critical한 스크립트의 카나리 배포 전략을 어떻게 수립하시겠습니까?

3 시스템 통합 테스트
Hard

Q. 마이크로서비스 아키텍처에서 여러 Linux 컨테이너와 네트워크, 스토리지가 복합적으로 연동되는 환경의 통합 테스트를 설계해야 합니다. Docker Compose나 Kubernetes 환경에서 재현 가능하고 격리된 테스트 환경을 구성하는 방법과, 테스트 데이터 관리 전략을 설명해주세요.

테스트 환경의 격리성과 재현성, 그리고 외부 의존성 처리 방법을 중심으로 생각해보세요.

A. 모범답안

Testcontainers 라이브러리를 활용하여 테스트 코드에서 프로그래밍 방식으로 Docker 컨테이너를 생성하고 테스트 후 자동으로 정리하여 격리성을 보장합니다. Kubernetes 환경에서는 Kind(Kubernetes in Docker)나 k3s로 경량 클러스터를 생성하고, Helm chart로 전체 스택을 배포하여 통합 테스트를 수행합니다. 네트워크 격리는 Docker의 custom bridge network나 Kubernetes namespace를 활용하고, 서비스 메시는 Istio나 Linkerd의 테스트 모드를 사용합니다. 테스트 데이터는 fixture 파일로 관리하고, 데이터베이스는 각 테스트마다 초기 스냅샷에서 복원하거나 트랜잭션 롤백을 활용합니다. 외부 API 의존성은 WireMock이나 MockServer로 stub을 구성하고, chaos engineering 도구(Pumba, Chaos Mesh)로 장애 시나리오도 테스트합니다. CI에서는 병렬 실행으로 테스트 시간을 단축하고, 테스트 결과는 Allure나 ReportPortal로 시각화합니다.

핵심 포인트
  • • Testcontainers와 Kind를 활용한 격리된 테스트 환경 자동 구성
  • • Helm chart 기반 전체 스택 배포와 namespace 격리
  • • fixture 기반 테스트 데이터 관리와 외부 의존성 mocking
  • • chaos engineering 도구로 장애 시나리오 테스트
답변에 넣으면 좋은 키워드
Testcontainers Kind k3s WireMock Helm Chaos Mesh fixture
실무에서는

마이크로서비스 배포 전 전체 시스템의 상호작용을 검증하고 통합 이슈를 조기에 발견하는 상황

Follow-up 질문

통합 테스트 실행 시간이 30분 이상 소요되어 개발 속도가 저하될 때, 어떤 최적화 전략을 적용하시겠습니까?

4 TDD와 리팩토링
Medium

Q. 레거시 Linux 시스템 관리 도구(C나 Python으로 작성된)를 TDD 방식으로 리팩토링하는 프로젝트를 진행한다고 가정합니다. 테스트 커버리지가 전혀 없는 상태에서 어떤 순서로 테스트를 추가하고 리팩토링을 진행할지, 그리고 시스템 안정성을 유지하면서 점진적으로 개선하는 전략을 설명해주세요.

Golden Master 테스트나 Characterization 테스트 같은 레거시 코드 대응 기법을 고려해보세요.

A. 모범답안

먼저 Characterization Test(특성화 테스트)를 작성하여 현재 동작을 있는 그대로 캡처하고, Golden Master 테스트로 입출력 조합의 기준선을 확보합니다. C 코드는 Check나 CMocka 프레임워크를, Python은 pytest를 사용하여 테스트 인프라를 구축합니다. 의존성이 낮은 유틸리티 함수부터 단위 테스트를 추가하고, seam(이음새)을 만들어 테스트 가능한 구조로 분리합니다. 리팩토링은 Extract Function, Extract Module 패턴으로 시작하여 코드를 작은 단위로 분해하고, 각 단위마다 테스트를 추가합니다. 시스템 호출이나 파일 I/O는 wrapper 함수로 감싸서 mock 가능하게 만들고, dependency injection을 적용합니다. 각 리팩토링 단계마다 기존 테스트가 통과하는지 확인하며, 코드 커버리지는 gcov/lcov나 coverage.py로 측정하여 점진적으로 향상시킵니다. 중요한 것은 한 번에 하나씩 변경하고, 각 단계마다 테스트를 실행하여 회귀를 방지하는 것입니다.

핵심 포인트
  • • Characterization Test와 Golden Master로 현재 동작 보존
  • • 의존성 낮은 부분부터 테스트 추가 후 점진적 리팩토링
  • • seam 생성과 dependency injection으로 테스트 가능한 구조 전환
  • • 단계별 테스트 실행과 커버리지 측정으로 안정성 보장
답변에 넣으면 좋은 키워드
Characterization Test Golden Master seam dependency injection gcov pytest CMocka
실무에서는

오래된 시스템 도구를 현대적인 테스트 가능한 코드로 전환하면서 서비스 중단 없이 개선하는 상황

Follow-up 질문

리팩토링 중 예상치 못한 동작 변경이 발견되었을 때, 이를 어떻게 처리하고 팀에 커뮤니케이션하시겠습니까?

5 코드 리뷰 문화
Medium

Q. 시스템 프로그래밍 팀에서 코드 리뷰 문화를 개선하여 코드 품질을 높이고자 합니다. 특히 성능, 보안, 메모리 안정성이 중요한 Linux 시스템 코드의 리뷰 시 체크해야 할 핵심 항목과, 효과적인 리뷰 프로세스 및 자동화 도구 활용 방안을 제시해주세요.

정적 분석 도구, 보안 스캐너, 그리고 리뷰어의 인지 부하를 줄이는 방법을 함께 고려해보세요.

A. 모범답안

코드 리뷰 전에 정적 분석 도구(Clang Static Analyzer, Coverity, cppcheck)와 보안 스캐너(Bandit, Semgrep)를 CI에서 자동 실행하여 기본적인 이슈를 사전에 제거합니다. 리뷰 체크리스트는 메모리 누수(Valgrind 결과 확인), 버퍼 오버플로우, race condition, 에러 핸들링 누락, privilege escalation 위험을 포함합니다. AddressSanitizer, ThreadSanitizer 같은 sanitizer를 테스트에 적용하여 런타임 이슈를 조기에 발견하고, 성능 크리티컬한 부분은 perf나 flamegraph로 프로파일링 결과를 공유합니다. 리뷰 프로세스는 PR 크기를 400줄 이하로 제한하여 리뷰어의 인지 부하를 줄이고, LGTM 전에 최소 2명의 승인을 요구합니다. 복잡한 알고리즘이나 동시성 코드는 설계 문서나 다이어그램을 먼저 리뷰하고, 코드는 그 다음 단계로 진행합니다. Gerrit이나 GitHub의 코드 리뷰 템플릿을 활용하여 일관된 리뷰 품질을 유지하고, 정기적으로 리뷰 메트릭(리뷰 시간, 발견된 버그 수)을 분석하여 프로세스를 개선합니다.

핵심 포인트
  • • 정적 분석과 sanitizer를 CI에 통합하여 자동화된 사전 검증
  • • 메모리 안정성, 보안, 동시성 중심의 리뷰 체크리스트
  • • PR 크기 제한과 다단계 승인으로 리뷰 품질 확보
  • • 리뷰 메트릭 분석과 지속적인 프로세스 개선
답변에 넣으면 좋은 키워드
Clang Static Analyzer AddressSanitizer Valgrind Coverity perf code review metrics
실무에서는

시스템 소프트웨어의 보안 취약점이나 메모리 버그를 배포 전에 발견하여 치명적 장애를 예방하는 상황

Follow-up 질문

리뷰어와 작성자 간 의견 충돌이 발생했을 때, 특히 성능과 가독성의 트레이드오프 상황에서 어떻게 합의점을 찾으시겠습니까?

댓글 0

로그인 후 댓글을 작성할 수 있습니다.

아직 댓글이 없습니다. 첫 번째 댓글을 남겨보세요!