拓冰建站拓冰建站
首页 / 资讯中心 / 正文

react-native-vision-camera 真机测试怎么做:让每台手机替你把相机回归跑绿

react-native-vision-camera 真机测试怎么做让每台手机替你把相机回归跑绿【免费下载链接】react-native-vision-camera A powerful, high-performance React Native Camera library.项目地址: https://gitcode.com/GitHub_Trending/re/react-native-vision-camerareact-native-vision-camera 是 React Native 的高性能相机库。这篇带你读懂它的真机自动化测试怎么用 react-native-harness 在真手机上跑 Jest 风格用例、怎么把回归挂在每次提交上、CI 红了怎么排查。为什么相机测试必须上真机你八成踩过这个坑capturePhoto在模拟器里秒过一上三星真机就黑图一上某安卓机型 HEIC 直接崩。相机不是纯 JS 逻辑它背后是 AVFoundation 和 CameraX 两套完全不同的原生管线模拟器根本没有那套 SoC 和传感器所以在模拟器跑绿约等于没测。这个项目的答案是把测试直接搬进真机用 react-native-harnessCI 则把它们丢到 AWS Device Farm 的真机池里跑。一句话心智模型这里没有模拟相机这种偷懒做法测的就是真机红了就是真红。三步在真机上跑起第一个相机测试整套测试跑在 monorepo 里示例 App 在 apps/simple-camera/。下面这条链最短装依赖 构建 debug APK只需一次bun install --frozen-lockfile cd apps/simple-camera bun run build:android装到手机、授权相机权限权限每次重装都要重给adb install -r android/app/build/outputs/apk/debug/app-debug.apk adb shell pm grant com.margelo.nitro.camera.example.simple android.permission.CAMERA跑套件先只看拍照那一片HARNESS_ANDROID_DEVICE_MANUFACTURER$(adb shell getprop ro.product.manufacturer) \ HARNESS_ANDROID_DEVICE_MODEL$(adb shell getprop ro.product.model) \ bun run test:harness:android -- --testPathPatternsphoto跑完你看到的是每个it(...)的 PASS / FAIL / SKIP 列表外加一份 JUnit XML。SKIP 会带上原因比如photoHDR: not supported on this device这正是它和假装跳过的区别——跳过是带证据的。配置入口是 rn-harness.config.mjsdefaultRunner默认androiddetectNativeCrashes: true意味着原生层崩溃也会被 Harness 捕获上报而不是悄悄吞掉。按要验证什么组织测试用例别用单元/集成/E2E这种类型词分文件夹——这个项目按要验证的行为分文件每个.harness.ts对应VisionCamera命令式 API 的一片。目录与覆盖面的映射见tests/README.md。正确性单个 API 的输出契约目的证明一个操作真的干了活而不只是返回了个对象。看 visioncamera.photo.harness.ts 的拍照片段const photo await photoOutput.capturePhoto( { flashMode: off, enableShutterSound: false }, {}, ) expect(photo.width).toBeGreaterThan(0) expect(photo.containerFormat).toBe(jpeg) photo.dispose() // 大图原 buffer用完就放判断这是不是好断言有个狠标准如果把实现 stub 成throw new Error(TODO)还能过那你测的是类型系统不是相机。所以别写typeof x number这种——Nitro 桥在原生侧早就该抛了。模块协作多输出会话不打架目的同一个会话里 photo video frame 三种输出并存时谁也不会把谁的硬件状态弄脏。看 visioncamera.multi-output.harness.ts它专门验证录制进行中替换某个输出、其余输出仍挂着这种最容易出竞态的场景。这里的关键纪律是每个it自建自己的 session跑完必须stop()不能靠beforeAll里建一个全局会话共享。硬件状态一旦泄漏到下一个用例红绿就全乱了。真实用户链路坐标换算与组件生命周期目的验证跨层数据闭环。visioncamera.coordinates.harness.tsx 把点从 Frame 坐标 → Camera 坐标 → View 坐标做一遍往返矩阵一退化立刻被抓到visioncamera.camera-view.harness.tsx 则只测Camera这个高层封装的生命周期与isActive不重复命令式 API 已经测过的东西。这条线的分层原则底层 API 测深高层组件测它有没有正确把底层串起来不重叠。两条贯穿始终的契约硬要求用expect软要求用context.skip。设备不支持某功能比如没 HDR就该带原因跳过而不是硬断言让它红。能力位都挂在CameraDevice/CameraController上如supportsPhotoHDR。等事件别轮询。session.isRunning在安卓上异步更新要await session.addOnStartedListener(...)不要sleep(500)猜它好了。sleep只允许用在录制时长本身就是被测行为的地方。把测试挂到每次提交CI 红了怎么排查配置在 .github/workflows/harness-aws-device.yml。你提交后不会立刻看到测试通过四个字而是这套流水线detect-changes先按改动路径决定跑不跑 Android/iOS然后分别构建、上传到 Device Farm 真机执行。它只在动了 packages/ 或示例 App 时才触发省真机费用。配完你会看到什么两个平台各一条Test Android/Test iOSjob跑完产出harness output log每个用例的 JS 控制台全量输出和 JUnit XML 两份 artifact。红了怎么排查按这个顺序最快现象先做什么job 直接失败、没日志确认detect-changes是不是把你的改动判进了shared没进就不会跑某itFAIL下载harness output loggrep FAIL看堆栈再打开 JUnit XML 看结构化摘要一堆 SKIP 但没 FAIL读 skip 原因确认是你的测试机缺能力还是用例写错了能力位怀疑原生崩溃Harness 开了detectNativeCrashes日志里会有原生栈本地复现就挂adb logcat流式看本地想稳定复现某条直接bun run test:harness:android -- --testPathPatterns文件名只跑那片即可。踩坑速查表问题原因解法第一个用例就红在cameraPermissionStatusadb install -r重装后权限失效重跑pm grant给相机/麦克风/定位断言isRunning一直 false安卓上该状态异步更新改等addOnStartedListener别 sleep 轮询用例间互相污染、时红时绿上一片没stop()会话硬件状态泄漏每个it自建 session 并stop()/dispose()某功能在某机型必然红你拿硬断言测了软功能换成context.skip带原因能力位查device.supports*大图用完内存暴涨Photo/Frame/Image握着原生 buffer用完立刻.dispose()平台差异导致一个平台红用Platform.OS分支把差异藏了保留共享用例让差异暴露真差异才开平台 guard效率清单优先测核心路径拍照、录像、坐标换算这三条先跑绿再铺长尾功能。每个 bug 报告都落成一个会红的it(...)随修复同分支合入别再开独立复现仓库。断言写行为不写类型rejects.toThrow()、toBeCloseTo()优先于手动Math.abs。缺 API 写不了的就it.skip加 TODO等 API 落地直接翻绿别删。失败先拉harness output log再grep FAIL别在 CI 日志里瞎翻。读完这套你手上就是一个改坏capturePhoto下个 PR 自动变红的回归网。想深入就翻 apps/simple-camera/tests/README.md 的完整契约核心被测的公共 API 在 packages/react-native-vision-camera/src/。【免费下载链接】react-native-vision-camera A powerful, high-performance React Native Camera library.项目地址: https://gitcode.com/GitHub_Trending/re/react-native-vision-camera创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考
分享:

看完干货,该让你的企业上线了

免费需求沟通 · 48 小时内出具建站方案 · 河南本地可上门