使用Appium自动测试你的React Native

Appium是一款开源测试工具,可以用来测试安卓/iOS/Windows端的原生应用和Web混合应用。

工作原理

Appium有一个客户端-服务器架构。Appium客户端向Appium服务器(一个Node.js HTTP服务器)发送请求,反过来,Appium服务器向执行动作的设备发送请求。然后,服务器将结果返回给客户端,让你知道测试的状态

功能

  ·跨平台

  · 多开发语言支持

  · 不需要重新编译应用程序

  · 不需要重复找轮子,可共用API

  · 市场占有率TOP1

  优点

  1. 方便的切换测试原生应用或App内嵌的web页面,对Hybrid App友好。

  2. 使用各个平台自身提供的测试框架,因此无需引入第三方代码或重新打包应用。

  3. 开源,维护频率很高,社区也有相对较高的活跃度。

  4. 支持通过自定义插件寻找元素。

  缺点

  1. 不支持单元测试、跨应用测试。

  2. 测试效率相对较低。

  使用

  默认您已经安装node以及对应的Android或IOS等相关环境

  使用appium有两种方式:

  方式1:npm;

  方式2:下载Appium Desktop,这是一种基于图形的、基于桌面的方式来启动 Appium 服务器。

  这里主要介绍npm的使用方式

  step 1: 安装appium

  npm install -g appium 

  step 2: 安装webdriverio

  npm install --save webdriverio @wdio/cli

  webdriverio是什么?

  基于Node.js的下一代浏览器和移动自动化测试框架

  生成 Web 驱动程序配置文件以在测试时应用配置。

  step 3: 配置webdriverio

  执行npx wdio config:

 生成的文件目录如下:

  及wdio.conf.js配置文件复制并修改有注释的字段到你的wdio.config.js文件。

exports.config = {
    port: 4723,
    services: [['appium', {command: 'appium'}]],
    runner: 'local',
    specs: ['./test/specs/**/*.js'], // 测试目录
    maxInstances: 1,
    capabilities: [
      {
        maxInstances: 1,
        browserName: '',
        appiumVersion: '1.22.3', // appium -v 获取
        platformName: 'Android',
        platformVersion: '9', // 安卓版本
        deviceName: 'Nexus_S_API_28', // 设备名称 执行adb -s emulator-5554 emu avd name 获取
        app: './android/app/build/outputs/apk/debug/app-debug.apk', // apk目录, 没有的话先在Android studio build一个
        automationName: 'UiAutomator2',
      },
    ],
    logLevel: 'trace',
    bail: 0,
    waitforTimeout: 10000,
    connectionRetryTimeout: 90000,
    connectionRetryCount: 3,
    framework: 'mocha',
    reporters: ['dot'],
    mochaOpts: {
      ui: 'bdd',
      timeout: 60000,
    },
  };

step 4: 创建一个测试用例

修改test/specs/example.e2e.js文件。

 describe('Simple App testing', () => {
    beforeEach(async () => {
      const app = await $('~app-root');
      await app.waitForDisplayed(10000, false);
    });
    it('Login test: valid case', async () => {
      const username = await $('~username');
      await username.setValue('codemagic');
      const password = await $('~password');
      await password.setValue('nevercode');
      const loginBtn = await $('~login');
      await loginBtn.click();
      await $('~loginstatus').waitForDisplayed(11000);
      const status = await $('~loginstatus').getText();
      expect(status).toHaveValueContaining('登录成功');
    });
    it('Login test: invalid case', async () => {
      await $('~username').setValue('nevercode');
      await $('~password').setValue('codemagic');
      await $('~login').click();
      await $('~loginstatus').waitForDisplayed(11000);
      const status = await $('~loginstatus').getText();
      expect(status).toHaveValueContaining('未登录'); // 断言https://webdriver.io/docs/api/expect-webdriverio
    });
  });

step 5: 创建一个app页面

如图

修改你的App.js:

import React, {Component} from 'react';
  import {
    TouchableHighlight,
    StyleSheet,
    Text,
    TextInput,
    View,
  } from 'react-native';
  export default class App extends Component {
    constructor() {
      super();
      this.state = {
        username: '',
        password: '',
        isLogined: false,
      };
    }
    inputChangeHandler = (value, name) => {
      this.setState({
        [name]: value,
      });
    };
    login = () => {
      if (
        this.state.username === 'codemagic' &&
        this.state.password === 'nevercode'
      ) {
        this.setState({isLogined: true});
      } else {
        this.setState({isLogined: false});
      }
    };
    render() {
      return (
        <View
          style={LOCAL_STYLES.wrapper}
          testID="app-root"
          accessibilityLabel="app-root">
          <Text style={{fontSize: 22, marginBottom: 20}}>登录页面</Text>
          <View style={LOCAL_STYLES.inputContainer}>
            <TextInput
              name="username"
              accessibilityLabel="username"
              style={LOCAL_STYLES.input}
              onChangeText={text => this.inputChangeHandler(text, 'username')}
            />
          </View>
          <View style={LOCAL_STYLES.inputContainer}>
            <TextInput
              name="password"
              accessibilityLabel="password"
              secureTextEntry={true}
              style={LOCAL_STYLES.input}
              onChangeText={text => this.inputChangeHandler(text, 'password')}
            />
          </View>
          <Text accessibilityLabel="loginstatus">
            {this.state.isLogined ? '登录成功' : '未登录'}
          </Text>
          <TouchableHighlight
            style={LOCAL_STYLES.buttonContainer}
            accessibilityLabel="login"
            onPress={this.login}>
            <Text style={{color: 'white'}}>Login</Text>
          </TouchableHighlight>
        </View>
      );
    }
  }
  const LOCAL_STYLES = StyleSheet.create({
    wrapper: {
      flex: 1,
      alignItems: 'center',
      justifyContent: 'center',
    },
    inputContainer: {
      borderBottomColor: '#AFAFAF',
      backgroundColor: '#FFFFFF',
      borderRadius: 10,
      borderBottomWidth: 1,
      marginBottom: 16,
      flexDirection: 'row',
      alignItems: 'center',
      width: '80%',
      borderColor: 'blue',
      borderWidth: 1,
    },
    buttonContainer: {
      height: 45,
      width: 250,
      flexDirection: 'row',
      justifyContent: 'center',
      alignItems: 'center',
      marginBottom: 20,
      borderRadius: 20,
      backgroundColor: '#00b5ec',
    },
  });

 step 6:  编译你的应用到模拟器

yarn android
  yarn start

step 7:  执行测试用例

  npx wdio ./wdio.conf.js

执行通过后会有passed的打印:

Spec Files:      1 passed, 1 total (100% completed) in 00:00:32

  至此,测试结束!

  Q&A

  如何来标识RN组件?

  对于 Android,添加accessibilityLabel属性;

  对于 iOS,添加testID属性。

 <View style={LOCAL_STYLES.inputContainer}>
        <TextInput name="password" accessibilityLabel="password" testID='password' secureTextEntry={true} style={LOCAL_STYLES.input} onChangeText={(text) => this.inputChangeHandler(text, "password")} />
   </View>
​现在我也找了很多测试的朋友,做了一个分享技术的交流群,共享了很多我们收集的技术文档和视频教程。
如果你不想再体验自学时找不到资源,没人解答问题,坚持几天便放弃的感受
可以加入我们一起交流。而且还有很多在自动化,性能,安全,测试开发等等方面有一定建树的技术大牛
分享他们的经验,还会分享很多直播讲座和技术沙龙
可以免费学习!划重点!开源的!!!
qq群号:485187702【暗号:csdn11】

最后感谢每一个认真阅读我文章的人,看着粉丝一路的上涨和关注,礼尚往来总是要有的,虽然不是什么很值钱的东西,如果你用得到的话可以直接拿走! 希望能帮助到你!【100%无套路免费领取】

  • 19
    点赞
  • 12
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
【优质项目推荐】 1、项目代码均经过严格本地测试,运行OK,确保功能稳定后才上传平台。可放心下载并立即投入使用,若遇到任何使用问题,随时欢迎私信反馈与沟通,博主会第一时间回复。 2、项目适用于计算机相关专业(如计科、信息安全、数据科学、人工智能、通信、物联网、自动化、电子信息等)的在校学生、专业教师,或企业员工,小白入门等都适用。 3、该项目不仅具有很高的学习借鉴价值,对于初学者来说,也是入门进阶的绝佳选择;当然也可以直接用于 毕设、课设、期末大作业或项目初期立项演示等。 3、开放创新:如果您有一定基础,且热爱探索钻研,可以在此代码基础上二次开发,进行修改、扩展,创造出属于自己的独特应用。 欢迎下载使用优质资源!欢迎借鉴使用,并欢迎学习交流,共同探索编程的无穷魅力! 基于业务逻辑生成特征变量python实现源码+数据集+超详细注释.zip基于业务逻辑生成特征变量python实现源码+数据集+超详细注释.zip基于业务逻辑生成特征变量python实现源码+数据集+超详细注释.zip基于业务逻辑生成特征变量python实现源码+数据集+超详细注释.zip基于业务逻辑生成特征变量python实现源码+数据集+超详细注释.zip基于业务逻辑生成特征变量python实现源码+数据集+超详细注释.zip基于业务逻辑生成特征变量python实现源码+数据集+超详细注释.zip 基于业务逻辑生成特征变量python实现源码+数据集+超详细注释.zip 基于业务逻辑生成特征变量python实现源码+数据集+超详细注释.zip
提供的源码资源涵盖了安卓应用、小程序、Python应用和Java应用等多个领域,每个领域都包含了丰富的实例和项目。这些源码都是基于各自平台的最新技术和标准编写,确保了在对应环境下能够无缝运行。同时,源码中配备了详细的注释和文档,帮助用户快速理解代码结构和实现逻辑。 适用人群: 这些源码资源特别适合大学生群体。无论你是计算机相关专业的学生,还是对其他领域编程感兴趣的学生,这些资源都能为你提供宝贵的学习和实践机会。通过学习和运行这些源码,你可以掌握各平台开发的基础知识,提升编程能力和项目实战经验。 使用场景及目标: 在学习阶段,你可以利用这些源码资源进行课程实践、课外项目或毕业设计。通过分析和运行源码,你将深入了解各平台开发的技术细节和最佳实践,逐步培养起自己的项目开发和问题解决能力。此外,在求职或创业过程中,具备跨平台开发能力的大学生将更具竞争力。 其他说明: 为了确保源码资源的可运行性和易用性,特别注意了以下几点:首先,每份源码都提供了详细的运行环境和依赖说明,确保用户能够轻松搭建起开发环境;其次,源码中的注释和文档都非常完善,方便用户快速上手和理解代码;最后,我会定期更新这些源码资源,以适应各平台技术的最新发展和市场需求。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

代码小怡

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值