哪种是测试 Flutter 应用程序的最佳方法
Which is the best approach for testing Flutter Apps
我正在为依赖 API 的 Flutter 应用程序工作。我们正在考虑测试策略,我们想知道哪种方法最好。
根据他们的文档 (https://flutter.dev/docs/testing),他们有 3 个级别的测试:
- 单元测试
- 小部件测试
- 集成测试(Pump 小部件新方法)
- 集成测试(Flutter 驱动程序旧方法)
由于我们的资源有限,我们想知道应该先取什么。到目前为止,很少有人在测试上投入精力。
我们的情况是这样的:
- 单元测试(50% 覆盖率)
- 小部件测试(0% 覆盖率)
- 集成测试(Pump 小部件新方法 - 0% 覆盖率)
- 集成测试(Flutter 驱动程序旧方法 - 仅涵盖几个测试场景,主要流程)
- API 测试:单元测试和功能测试的覆盖率为 0%
并且我们没有使用任何测试自动化框架,例如 WebdriverIO + Appium。
我们想知道我们应该在每个 Flutter 测试类别中投入多少精力,以及关于 Flutter 集成测试,仅使用新方法(Pumping every widget)进行集成测试是否有意义,或者我们还需要集成测试(Flutter 驱动程序的旧方法)吗?仅依靠使用泵小部件方法的集成测试并不能使我们感到非常自信。
我们正在考虑的一些选项是:
- 强 API 覆盖(单元测试和功能测试)+ Flutter 单元测试的强覆盖 + 很少使用 flutter 驱动程序方法进行集成测试
- 测试金字塔方法:大量单元测试 + 使用 pump widget 新方法进行较少的集成测试,API 测试和 Widget 测试 + 较少的 E2E 测试(可能使用使用 flutter 驱动程序方法的集成测试或外部自动化框架)和手动测试
- 只是单元测试+Widget测试+集成测试抽取widgets的新方法,力求三者都达到100%的覆盖率。
我们还认为,维护集成测试新方法(抽取小部件)在某种程度上非常耗时,因为您需要对应用程序的视图和内部结构有很好的理解。对于没有太多 Flutter 开发经验的 QA 自动化人员来说,这可能具有挑战性。
我应该首先涵盖哪些 Flutter 自动化测试类别,单元测试、小部件测试或集成测试?我应该改用外部自动化框架,例如 WebdriverIO + Appium 吗?
首先,此时此刻,我建议从应用程序的角度来考虑测试,而不是从 Flutter、React-native 或 Native 的角度来考虑,好吧,测试金字塔和测试概念并没有真正与任何开发挂钩 tool/framework, 在一天结束时,应用程序必须优雅地完成它应该做的事情。
现在,关于策略主题,取决于很多变量,我将只推送一些到这个答案,否则我会在这里写一篇文章。
有些事情需要考虑,甚至在编写策略之前:
- 我们什么时候测试?
- 本地构建和测试。
- 远程构建和测试(CI/CD 东西)。
- 预合并测试(CI/CD 东西)。
- 生产前测试(CI/CD 东西)。
- 生产监控测试(CI/CD 东西)。
- 我们有足够的资源吗?
- 至少一名专职人员负责测试及其任务。
- VMs/computers 由贵公司或云提供商托管,以 运行 CI/CD 管道中的测试。
根据我以前的测试经验,当您开始(覆盖率低)时,端到端测试确实显示出更多价值,为什么?
- 这主要是关于用户的观点。
- 它会回答诸如“用户甚至可以登录我们的应用程序并执行核心任务吗?”之类的问题。脆弱的局势。
- 涵盖应用程序屏幕和功能如何协同工作。
- 涵盖应用程序如何与后端服务集成。
- 好吧,如果 API 有问题,它很可能会在 UI 上显示。
- 涵盖数据是否以对用户有意义的方式保存
- 它在数据库上可能是“错误的”,但对于使用它的人来说仍然有意义。
- 你不需要 50000 个测试来获得很好的覆盖率,但是这种测试的维护成本仍然很高。
当你“什么都没有”时,金字塔的基础(快速且成本较低的测试)的问题是,你可以进行 50000 次单元测试,但如果核心有效,仍然没有答案,为什么?要回答这个问题,您需要接触到真实的或接近真实的世界,单元不会为您提供。你真的只能回答这样的问题:“好吧,如果输入无效,它会显示一条花哨的消息。但是用户可以登录吗?”
基础 仍然 重要,测试金字塔仍然是一个非常好的指导,但我现在对你们的想法是,当你们开始的时候,试试获得有意义的端到端案例,并确保它们正常工作,应用程序的核心在每次发布时都在那里,按预期工作,充满信心地发布真的很好。
在某个时候端到端的数量会增加,你会开始看到维护它的成本,所以你可以开始在金字塔中向下移动一个步骤,检查在e2e,现在可以在集成级别、小部件级别等
测试也是一个迭代和增量的工作,它会随着团队的成熟而改变,试图用它去接近完美的世界,会导致很多有问题的发布,我的总体观点是,首先, 尝试进行能给出有意义答案的测试。
另一个注意事项是: 从金字塔的顶端开始,不 应该链接到任何开发框架(Flutter, react-native 等)也会给你时间来加快 Flutter 的速度,同时你仍然在为 e2e 覆盖做出贡献,使用像 Appium 这样的东西(SDETS/QA 必须对它有一些熟悉)例如,可能是并行工作。
我正在为依赖 API 的 Flutter 应用程序工作。我们正在考虑测试策略,我们想知道哪种方法最好。
根据他们的文档 (https://flutter.dev/docs/testing),他们有 3 个级别的测试:
- 单元测试
- 小部件测试
- 集成测试(Pump 小部件新方法)
- 集成测试(Flutter 驱动程序旧方法)
由于我们的资源有限,我们想知道应该先取什么。到目前为止,很少有人在测试上投入精力。
我们的情况是这样的:
- 单元测试(50% 覆盖率)
- 小部件测试(0% 覆盖率)
- 集成测试(Pump 小部件新方法 - 0% 覆盖率)
- 集成测试(Flutter 驱动程序旧方法 - 仅涵盖几个测试场景,主要流程)
- API 测试:单元测试和功能测试的覆盖率为 0%
并且我们没有使用任何测试自动化框架,例如 WebdriverIO + Appium。
我们想知道我们应该在每个 Flutter 测试类别中投入多少精力,以及关于 Flutter 集成测试,仅使用新方法(Pumping every widget)进行集成测试是否有意义,或者我们还需要集成测试(Flutter 驱动程序的旧方法)吗?仅依靠使用泵小部件方法的集成测试并不能使我们感到非常自信。
我们正在考虑的一些选项是:
- 强 API 覆盖(单元测试和功能测试)+ Flutter 单元测试的强覆盖 + 很少使用 flutter 驱动程序方法进行集成测试
- 测试金字塔方法:大量单元测试 + 使用 pump widget 新方法进行较少的集成测试,API 测试和 Widget 测试 + 较少的 E2E 测试(可能使用使用 flutter 驱动程序方法的集成测试或外部自动化框架)和手动测试
- 只是单元测试+Widget测试+集成测试抽取widgets的新方法,力求三者都达到100%的覆盖率。
我们还认为,维护集成测试新方法(抽取小部件)在某种程度上非常耗时,因为您需要对应用程序的视图和内部结构有很好的理解。对于没有太多 Flutter 开发经验的 QA 自动化人员来说,这可能具有挑战性。
我应该首先涵盖哪些 Flutter 自动化测试类别,单元测试、小部件测试或集成测试?我应该改用外部自动化框架,例如 WebdriverIO + Appium 吗?
首先,此时此刻,我建议从应用程序的角度来考虑测试,而不是从 Flutter、React-native 或 Native 的角度来考虑,好吧,测试金字塔和测试概念并没有真正与任何开发挂钩 tool/framework, 在一天结束时,应用程序必须优雅地完成它应该做的事情。
现在,关于策略主题,取决于很多变量,我将只推送一些到这个答案,否则我会在这里写一篇文章。
有些事情需要考虑,甚至在编写策略之前:
- 我们什么时候测试?
- 本地构建和测试。
- 远程构建和测试(CI/CD 东西)。
- 预合并测试(CI/CD 东西)。
- 生产前测试(CI/CD 东西)。
- 生产监控测试(CI/CD 东西)。
- 我们有足够的资源吗?
- 至少一名专职人员负责测试及其任务。
- VMs/computers 由贵公司或云提供商托管,以 运行 CI/CD 管道中的测试。
根据我以前的测试经验,当您开始(覆盖率低)时,端到端测试确实显示出更多价值,为什么?
- 这主要是关于用户的观点。
- 它会回答诸如“用户甚至可以登录我们的应用程序并执行核心任务吗?”之类的问题。脆弱的局势。
- 涵盖应用程序屏幕和功能如何协同工作。
- 涵盖应用程序如何与后端服务集成。
- 好吧,如果 API 有问题,它很可能会在 UI 上显示。
- 涵盖数据是否以对用户有意义的方式保存
- 它在数据库上可能是“错误的”,但对于使用它的人来说仍然有意义。
- 你不需要 50000 个测试来获得很好的覆盖率,但是这种测试的维护成本仍然很高。
当你“什么都没有”时,金字塔的基础(快速且成本较低的测试)的问题是,你可以进行 50000 次单元测试,但如果核心有效,仍然没有答案,为什么?要回答这个问题,您需要接触到真实的或接近真实的世界,单元不会为您提供。你真的只能回答这样的问题:“好吧,如果输入无效,它会显示一条花哨的消息。但是用户可以登录吗?”
基础 仍然 重要,测试金字塔仍然是一个非常好的指导,但我现在对你们的想法是,当你们开始的时候,试试获得有意义的端到端案例,并确保它们正常工作,应用程序的核心在每次发布时都在那里,按预期工作,充满信心地发布真的很好。
在某个时候端到端的数量会增加,你会开始看到维护它的成本,所以你可以开始在金字塔中向下移动一个步骤,检查在e2e,现在可以在集成级别、小部件级别等
测试也是一个迭代和增量的工作,它会随着团队的成熟而改变,试图用它去接近完美的世界,会导致很多有问题的发布,我的总体观点是,首先, 尝试进行能给出有意义答案的测试。
另一个注意事项是: 从金字塔的顶端开始,不 应该链接到任何开发框架(Flutter, react-native 等)也会给你时间来加快 Flutter 的速度,同时你仍然在为 e2e 覆盖做出贡献,使用像 Appium 这样的东西(SDETS/QA 必须对它有一些熟悉)例如,可能是并行工作。