본문으로 바로가기
제품데스크톱 도구TASTECAD도면 확인TASTEFILES파일 관리TASTEFTP파일 전송TASTESSH원격 작업공간TASTEZIP압축과 해제개발 도구TASTECODERust 통합 개발 환경TASTESTUDIO통합 개발·테스트 환경TASTEETL데이터 통합(ETL)서버TASTEREMOTE원격 데스크톱 서버TASTEGEO공간정보 서버TASTEMAIL메일 작업공간시작하기다운로드문서구매모든 제품
마켓플레이스
소식
개발소식오늘의 개발 소식개발 문서프로그래밍 언어RustTypeScriptJavaScriptPythonGoC#JavaCC++KotlinDart프런트엔드 프레임워크Next.jsReactVue.js · NuxtSvelteKitAngular서버 프레임워크Spring BootDjangoFastAPIASP.NET CoreNestJS · Express앱 · 데스크톱 프레임워크TauriFlutterReact NativeElectron알고리즘알고리즘 기초알고리즘 핵심알고리즘 심화실무 알고리즘
커뮤니티프로젝트개발 로그프롬프트AI 도구 이슈쇼케이스커뮤니티 안내
협업기술 전수홈페이지 구축데스크톱 앱 구축릴리스·결제 파이프라인판매 파트너문의
서비스원격 데스크톱설치 패키지 커스텀
TASTEDEV
제품

데스크톱 도구

TASTECAD복잡한 도면을 가볍게 열다TASTEFILES필요한 파일만, 가장 빠르게TASTEFTP파일이 오가는 가장 단정한 길TASTESSH서버와 나 사이, 더 단단한 연결TASTEZIP더 빠르게 묶고, 더 안전하게 풀다

개발 도구

TASTECODERust 앱을 편집 · 빌드 · 디버깅 · 테스트까지 한 창에서TASTESTUDIO편집부터 원격 테스트와 승인 기반 AI 수정까지TASTEETL값을 보며 데이터를 옮깁니다

서버

TASTEREMOTE우리 회사 서버로 운영하는 원격 데스크톱TASTEGEOGeoServer 호환 공간정보 서버를 Rust로 다시 세웁니다TASTEMAIL메일의 주도권을 다시 내 손에

시작하기

다운로드모든 제품 최신 판문서제품 사용법구매구독 · 영구 라이선스모든 제품모든 제품 한눈에
모든 제품
마켓플레이스소식
개발

소식

오늘의 개발 소식언어 · 프레임워크 · GitHub · AI 공식 발표개발 문서언어 · 프레임워크 · 알고리즘 안내서

프로그래밍 언어

RustTypeScriptJavaScriptPythonGoC#JavaCC++KotlinDart

프레임워크

프런트엔드 프레임워크Next.jsReactVue.js · NuxtSvelteKitAngular
서버 프레임워크Spring BootDjangoFastAPIASP.NET CoreNestJS · Express
앱 · 데스크톱 프레임워크TauriFlutterReact NativeElectron

알고리즘

알고리즘 기초복잡도 분석 · 정렬 · 탐색 · 기본 자료구조 · 트리와 힙알고리즘 핵심그래프 탐색 · 최단 경로와 최소 신장 트리 · 동적 계획법 · 탐욕 알고리즘 · 분할 정복 · 백트래킹알고리즘 심화문자열 알고리즘 · 수학과 정수론 · 비트 연산 · 구간 트리 · 유니온 파인드실무 알고리즘코딩 면접 풀이 전략 · LRU 캐시 · 레이트 리미터 · 일관된 해시
개발 문서 전체 보기
커뮤니티
프로젝트빌더와 작업 발견개발 로그결정과 시행착오프롬프트재사용 가능한 지시AI 도구 이슈Claude · Codex · Gemini 문제와 우회법쇼케이스완성된 결과커뮤니티 안내공개하고 함께 만드는 방식
협업
기술 전수Rust·egui 네이티브 앱 만들기홈페이지 구축10개 언어, 계정, 문서·다운로드데스크톱 앱 구축Rust·egui, WebView 없이릴리스·결제 파이프라인서명 · MSI·deb·rpm·AppImage · 해시판매 파트너소개하고 결제액의 30% 받기문의구축 · 제휴 · 투자 문의
서비스
원격 데스크톱브라우저로 내 컴퓨터에 접속설치 패키지 커스텀필요한 기능만, 설정은 미리
구매
KO
한국어EnglishDeutschEspañolFrançaisItalianoPortuguês (Brasil)日本語简体中文繁體中文
로그인
로그인
TASTEDEV

작은 도구부터, 더 좋은 개발까지.

support@tastedev.netTASTEDEV 후원하기
제품제품군구매문서다운로드마켓플레이스고객 지원
커뮤니티프로젝트개발 로그프롬프트AI 도구 이슈쇼케이스
정책개인정보처리방침이용약관구독 약관환불 정책커뮤니티 운영 정책
계정로그인가입하기
방문자
오늘
012345678901234567890123456789012345678901234567890123456789
어제
012345678901234567890123456789012345678901234567890123456789
누적 조회
0123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789
상호
지엑스소프트
대표자
최영구
사업자등록번호
853-44-00368
주소
인천광역시 미추홀구 경인로 351 9층 V24
전화
+82-10-4404-1523
이메일
whitecalvin@tastedev.net
개인정보 보호책임자
최영구

© 2026 TASTEDEV제품 정보는 현재 검증된 개발 소스를 기준으로 합니다.출시·고도화 중

React Native 문서
React Native
React Native 시작하기프로젝트 구조핵심 개념데이터와 상태테스트배포
토론

React Native 안내서 · 5/6

테스트

React Native 앱은 보통 세 층으로 테스트합니다. 순수한 로직은 Jest로, 컴포넌트는 React Native Testing Library로, 실제 기기에서 사용자 흐름 전체는 Detox나 Maestro 같은 E2E 도구로 검사합니다.

층도구실행 환경
단위JestNode.js
컴포넌트Jest + React Native Testing LibraryNode.js(네이티브 없이 렌더링)
E2EDetox, Maestro에뮬레이터·시뮬레이터·실기기

Jest 설정

Community CLI 템플릿에는 react-native 프리셋으로 설정된 Jest가 이미 들어 있습니다. Expo 프로젝트에서는 jest-expo 프리셋을 추가합니다.

npx expo install jest-expo jest @types/jest -- --dev
npx expo install @testing-library/react-native -- --dev
{
  "scripts": {
    "test": "jest --watchAll"
  },
  "jest": {
    "preset": "jest-expo"
  }
}

프리셋은 React Native 모듈의 모의 구현과 변환 설정을 제공하므로, 테스트 파일(*.test.tsx 또는 __tests__ 폴더)만 만들면 됩니다.

단위 테스트

화면과 상관없는 계산·변환 로직은 일반 Jest 테스트로 검사합니다. 로직을 컴포넌트 밖 함수로 빼 두면 테스트하기 쉬워집니다.

// price.ts
export const formatPrice = (won: number) => `${won.toLocaleString("ko-KR")}원`;

// price.test.ts
import { formatPrice } from "./price";

test("천 단위 구분 기호를 붙인다", () => {
  expect(formatPrice(12000)).toBe("12,000원");
});

컴포넌트 테스트

React Native Testing Library(RNTL)는 컴포넌트를 렌더링한 뒤 사용자가 보는 글자나 접근성 역할로 요소를 찾고, 누르기·입력 같은 동작을 흉내 냅니다. 구현 세부보다 사용자가 보는 결과를 검사하는 것이 원칙입니다.

import { render, screen, userEvent } from "@testing-library/react-native";
import { Counter } from "./Counter";

test("누르면 숫자가 올라간다", async () => {
  const user = userEvent.setup();
  render(<Counter />);

  expect(screen.getByText("Count: 0")).toBeOnTheScreen();
  await user.press(screen.getByText("Increment"));
  expect(screen.getByText("Count: 1")).toBeOnTheScreen();
});

toBeOnTheScreen, toHaveTextContent 같은 매처는 RNTL이 제공합니다. 오래된 버전에서는 설정 파일에서 @testing-library/react-native/extend-expect를 불러와야 할 수 있습니다. 조회 함수는 getBy...(즉시, 없으면 오류), queryBy...(없으면 null), findBy...(나타날 때까지 기다림)로 나뉩니다.

비동기와 모의 객체

네트워크나 네이티브 모듈은 테스트에서 모의 객체로 바꿉니다. AsyncStorage는 공식 Jest 모의 구현을 제공합니다.

import { render, screen } from "@testing-library/react-native";
import { Posts } from "./Posts";

jest.mock("@react-native-async-storage/async-storage", () =>
  require("@react-native-async-storage/async-storage/jest/async-storage-mock"),
);

test("서버에서 받은 글을 보여 준다", async () => {
  global.fetch = jest.fn().mockResolvedValue({
    ok: true,
    json: async () => [{ id: 1, title: "첫 글" }],
  }) as jest.Mock;

  render(<Posts />);
  expect(await screen.findByText("첫 글")).toBeOnTheScreen();
});

E2E 테스트: Detox와 Maestro

E2E 테스트는 실제로 빌드한 앱을 에뮬레이터나 기기에서 실행해 사람이 쓰듯 조작합니다. 요소를 찾기 쉽도록 컴포넌트에 testID를 붙여 둡니다.

Detox는 Wix가 만든 그레이박스 E2E 프레임워크입니다. 앱 내부의 네트워크 요청·애니메이션이 끝날 때까지 자동으로 기다리므로 테스트가 덜 흔들립니다. 테스트는 JavaScript로 쓰고 Jest로 실행합니다. 설정은 .detoxrc.js에 두며, Expo 프로젝트는 개발 빌드나 prebuild로 네이티브 프로젝트를 만든 뒤 씁니다.

describe("로그인", () => {
  beforeAll(async () => {
    await device.launchApp();
  });

  it("로그인하면 홈 화면이 보인다", async () => {
    await element(by.id("email")).typeText("user@example.com");
    await element(by.id("login-button")).tap();
    await expect(element(by.text("Welcome"))).toBeVisible();
  });
});
npx detox build --configuration ios.sim.debug
npx detox test --configuration ios.sim.debug

설정 이름(ios.sim.debug 등)은 .detoxrc.js에서 정한 것입니다.

Maestro는 YAML로 흐름을 적는 블랙박스 E2E 도구입니다. 앱 코드를 고치지 않고 설치된 앱을 바깥에서 조작하므로 설정이 간단하며, EAS Workflows에서도 실행할 수 있습니다. React Native의 testID는 Maestro에서 id로 찾습니다.

appId: com.example.myapp
---
- launchApp
- tapOn:
    id: "email"
- inputText: "user@example.com"
- tapOn: "Log in"
- assertVisible: "Welcome"
maestro test .maestro/login.yaml

정리

  • 단위·컴포넌트 테스트는 Jest(Expo는 jest-expo 프리셋)와 React Native Testing Library로 씁니다.
  • 사용자가 보는 글자와 역할로 요소를 찾고, userEvent로 동작을 흉내 냅니다.
  • 네트워크와 네이티브 모듈은 모의 객체로 바꿉니다.
  • 실제 앱 흐름은 Detox(그레이박스, JavaScript)나 Maestro(블랙박스, YAML)로 검사합니다.
이 장에 대해 질문이 있나요?
이전 장데이터와 상태다음 장배포

댓글 0개

인기 댓글순최신순

로그인 · 로그인하면 댓글을 남길 수 있습니다.