开源 | 携程机票BDD UI Testing框架 - Flybirds

Flybirds跨端UI自动化测试:基于BDD与插件化架构的一站式解决方案 UI自动化测试是软件质量保障的关键环节,其核心原理是通过脚本模拟用户操作,对应用界面进行功能验证。随着多端应用(Web、Android、iOS、小程序等)的普及,传统针对单一平台编写和维护多套脚本的方式,面临学习成本高、维护效率低下的挑战。其技术价值在于通过统一框架降低多端测试的复杂性,提升测试脚本的复用性和可维护性。在应用场景上,尤其适合需要保障Web、移动端等多平台业务一致性的产品。本文聚焦的Flybirds方案,正是通过结合BDD(行为驱动开发)范式与插件化架构,实现了“一套用例,多端运行”的跨端UI 阅读详情

作者简介

 

Liang,携程研发总监,关注工程效能、DevOps、自动化框架等。

一、背景

携程机票从2018年年中正式引入BDD,至今已3年多,成为内部首选的敏捷开发技术。

Flybirds 是一套基于BDD模式的前端UI自动化测试框架,提供了一系列开箱即用的工具和完善的文档,现在逐步稳定,成为机票内部首选的BDD-UI-Testing测试框架。

二、为什么开源

  • 分享我们的BDD技术方案

  • 期待业内使用BDD技术的同行通过开源社区与我们进行更深入的交流

本文将从特性介绍、环境搭建、使用帮助、自定义扩展、持续集成、发版计划这几个方面对框架进行介绍。

三、Flybirds

  • 基于Behave,实现BDD中“自然语言测试用例文档”和“自动化测试代码”关联需要用到支持BDD工具。

  • 基于Airtest,实现BDD中“测试用例能在自动化测试平台上执行”需要用到UI自动化测试框架。

  • 基于Multiple-cucumber-html-reporter,实现可视化的测试报告。

ce831fc5490d295ee149d7e5d01535fd.png

四、特性

使用Flybirds你能够完成大部分的手机端自动化操作,以下是一些帮助入门的特性描述:

  • 基于BDD模式,类自然语言语法

  • 支持自动化APP操作、表单提交、UI元素校验、键盘输入、Deeplink跳转等

  • 默认支持英文、中文两种语言,支持更多语言扩展

  • 插件式设计,支持用户自定义自动化扩展

  • 提供cli脚手架,快速搭建项目

  • 提供html报告

五、环境搭建

5.1 使用pip安装flybirds框架,过程中会自动安装所需的依赖包

pip3 install flybirds

在Mac/Linux系统下,需要手动赋予adb可执行权限

  • for mac

cd {your_python_path}/site-packages/airtest/core/android/static/adb/mac
chmod +x adb
  • for linux

cd {your_python_path}/site-packages/airtest/core/android/static/adb/linux
chmod +x adb

5.2 使用脚手架创建项目

flybirds create

7e97bb2cd68a633f0df5ba224167ba96.png

六、快速上手

6.1 运行演示

为了帮助使用,项目创建时,会生成中英文的Android、iOS演示feature,方便用户参考。

features/test/
features/test/android
features/test/android/cn/everything.feature
features/test/android/en/everything.feature
features/test/ios
features/test/ios/cn/everything.feature
features/test/ios/en/everything.feature

以“Android”为例:

  • 执行命令 adb devices , 检查设备列表中是否包含测试设备

  • 开始运行

cd {PATH_TO_PROJECT_FOLDER}
flybirds run -P features/test/android

框架会通过flybirds_config中配置的packagePath自动下载测试包并安装(请确保手机已经打开”允许安装未知来源“ )。

运行结果如下:

11 features passed, 0 failed, 0 skipped, 0 untested
23 scenarios passed, 0 failed, 0 skipped, 0 untested
117 steps passed, 0 failed, 0 skipped, 0 undefined, 0 untested
Took 5m21.300s
=====================================================================================
    Multiple Cucumber HTML report generated in:


    /Users/test/my_first_project/report/7eb9162a-9d42-4fde-a5d7-d8d4bca7a8d8/index.html
=====================================================================================

接下来,了解下更多项目细节。

6.2 项目结构

  • config:配置文件

  • features:测试用例feature文件

  • pscript:自定义扩展

  • report:测试报告

6.3 features目录

基础目录结构如下:

  • test:存放feature文件,这些文件使用自然语言编写,最好由软件项目中的非技术业务、产品人员参与者编写。

  • steps:存放场景中使用的step语句实现,“steps.py”中加载了所有的step语句模版。

features/
features/test/
features/test/everything.feature
features/steps/
features/steps/steps.py

复杂些的目录结构参考如下:

features/
features/test/
features/test/list.feature
features/test/buy.feature
features/test/detail.feature
features/steps/
features/steps/steps.py

6.4 feature文件

feature文件包含用户动作,行为特征描述及预期结果的文本,行为特征部分使用Gherkin语言编写。

feature文件,也称为功能文件,有两个目的:文档和自动化测试。

以关键字开头(“功能”、“场景”、“场景大纲”、“当”、“而且”、“那么”……), 文件中的任何位置都允许使用注释行。

  • 功能 (Feature) 是被测试功能的一些合理的描述性标题,由场景组成。他们可以选择有一个描述、一个背景和一组标签。

  • 背景 (Background) 由一系列类似于场景的步骤组成。它允许你向功能的场景添加一些上下文。在此功能的每个场景之前执行。

  • 场景 (Senario) 标题应该是被测试场景的合理描述性标题,由一系列给定条件的步骤组成。

  • 场景大纲 (Senario Outline) 包含功能的详细描述,可以有一组预期条件和结果来配合你的场景步骤。

以下是中文feature例子:

deedd21417ff30021ac1921431894cf2.png

以下是英文feature例子:

1d50ff7f8b433c3053323f775340bd96.png

6.5 step语句模板

以下列出了部分模版 | 更多模版查阅

392b93fad97445d5f397ac4959ca0856.png

6.6 Hooks

用户可在以下文件中定义hooks:

pscript/dsl/step/hook.py
  • before_step(context,step), after_step(context, step)

        在每个步骤(step)之前和之后运行

  • before_scenario(context,scenario), after_scenario(context, scenario)

在每个场景(senario)之前和之后运行

  • before_feature(context,feature), after_feature(context, feature)

在每个功能文件(feature)之前和之后运行

  • before_tag(context,tag), after_tag(context, tag)

在用给定名称标记(tag)的部分之前和之后运行

  • before_all(context), after_all(context)

在所有执行之前和之后运行

6.7 标签(Tags)

可以使用tag标记不同的场景,方便有选择性的运行。

下面是一个例子:

f5c3c57036ff34ae7b8cee44c52ed3a0.png

运行有特定tag的场景,多个用逗号隔开:

flybirds run -T tag1,tag2

‘-’开头表示运行不包含某tag的场景:

flybirds run -T -tag

七、运行前检查

7.1 请确保配置的测试设备能够正常连接

  • Android: 执行命令 adb devices ,检查设备列表中是否包含测试设备

  • iOS:以tidevice库举例,执行命令 tidevice list,检查设备列表中是否包含测试设备

Android设备连接 Q&A

  • 请先安装手机对应品牌的官方驱动,确保能使用电脑对手机进行USB调试

  • 确保已经打开了手机中的"开发者选项",并且打开"开发者选项"内的"允许USB调试"

  • 部分手机需要打开"允许模拟位置"、"允许通过USB安装应用"

  • 关闭电脑上已经安装的手机助手软件,能避免绝大多数问题,请务必在任务管理器中手工结束手机助手进程

iOS设备连接 Q&A

  • 请先准备一台macOS ,使用xcode部署 iOS-Tagent 成功后,能够在mac或windows机器上连接到iOS手机。请点击链接下载项目代码到本地进行部署。

  • mac 环境通过 Homebrew 安装iproxy: brew install libimobiledevice

  • windows 环境安装itunes

7.2 下载安装测试包

  • Android:

    框架会通过config中配置的packagePath自动下载测试包并安装(请确保手机已经打开”允许安装未知来源“ )。也可手动下载安装:下载地址

  • iOS:

a. 请手动下载演示APP进行安装:下载地址

b. 开启wdaproxy:shell tidevice --udid 

$udid wdaproxy -B $web_driver_angnt_bundle_id -p $port

八、运行参数

在终端输入以下内容来查看flybirds运行项目时支持的操作

flybirds run --help
  • run

执行features目录下所有的feature文件

  • --path, -P

指定需要执行的feature集合,可以是目录,也可以指定到具体feature文件,默认是 ‘features’ 目录.

示例:

flybirds run -P ./features/test/demo.feature
  • --tag, -T

运行有特定tag的场景,多个用逗号隔开,‘-’开头表示不运行包含此tag的场景

flybirds run -T tag1,tag2,-tag3,tag4
  • --format, -F

指定生成测试结果的格式,默认是 json.

示例:

#默认
flybirds run --format=json

九、配置参数

提供了丰富的配置项 | 帮助文档

必须配置项:deviceId packageName。

连接iOS设备时,需要额外配置webDriverAgent、platform。

45d7f85aecff864d367107e8558e6efd.png

十、报告(report)

报告包含汇总Summary和功能 (feature) 、场景 (senario) 的执行结果,对于失败的场景 (senario),报告中会展示当时的屏幕图像和视频,下面是一个例子。

36e177524efda5a5f8b222c2c1444c04.png

十一、自定义step语句模板

在编写Feature的过程中,可能会遇到提供的公共语句不能满足自身项目的需求,需要自定义语句。比如:需要对接某个内部工具API,此时需要用到自定义语句功能。

自定义语句功能会用到python,如果你不了解这门编程语言,也不必要太担心,因为只会使用到最基础的python语法,这并不会太难。

使用方法

  • 进入项目目录"psscript/dsl/steps"

  • 新建.py文件来编写自定义语句

  • 在feature/steps/steps.py中import该.py文件

示例代码如下:

4f0204db9de919c3578a7e8ffa25de7c.png

对于团队内部通用的自定义功能,可以考虑创建一个extend package,flybirds支持动态加载,package命名包含“-flybirds-plugin”即可。

十二、自定义框架扩展

理论上BDD-UI-Testing 可以适用在所有端,比如:APP、Web、小程序。

框架的插件式设计模式,保留了良好的扩展,当前版本只开放了APP端支持,未来会逐步开放更多,下面是两个例子供大家参考。

增加web端扩展

  • 在plugins.default下添加自己的web包。

  • 添加web对应的实现。比如page.py,element.py,如果需要增加其他的插件实现类,只需要在GlobalContext类中添加对应的名称。

  • 在plugin.event下添加自己的web包。

  • 在event.web包下重写或者新增类,比如重写run事件可以在plugin.event.web下面添加"run.py",具体实现逻辑可参照已有的run.py。

  • 在项目配置文件"flybirdes_config.json"配置 device_info.platform值为"web"。

修改当前APP端扩展

  • 可通过配置"plugin_info.json"对已有的plugins进行修改(只支持修改不支持新增),比如你希望对plugins下面ios.app进行修改:

a. 可以在本地创建一个自己 app.py

b. 在plugin_info.json对应平台中添加如下配置:

"app": {
   "path": "{local_path}/app.py",
   "ns": "app.plugin"
}

{local_path} 为本地路径,"ns"为包名,注意包名的唯一性。

十三、其他语种支持

flybirds可以支持40几种语言,在以下文件中增加公共方法的语言配置即可。

flybirds/core/dsl/globalization/i18n.py

示例代码如下:

2fd8861afacfce31af18edbb2a8f56ca.png

十四、持续集成

cli提供的命令行执行模式,可以非常方便加入各种持续集成工具。

以Jenkins为例:

# Inside the jenkins shell command
cd {PATH_TO_PROJECT_FOLDER}
# Run
flybirds run -P ./features/test/everything.feature
cp -R reports $WORKSPACE

十五、发版计划

我们将按照 SemVer 版本控制规范进行发版。逐步新增功能和代码优化,非常欢迎加入到我们的共建计划中,在 Github 上提出宝贵建议,以及在使用时遇到的一切问题,我们也会对此每周进行一次小版本的迭代。你也可以在这里给我们精神支持,点上一颗 Star。

1)Fork 仓库

2)创建分支 (git checkout -b my-new-feature)

3)提交修改 (git commit -am 'Add some feature')

4)推送 (git push origin my-new-feature)

5)创建 PR

  • 欢迎在 github issues 区提问

  • 支持邮箱:flybirds_support@trip.com

团队招聘信息

我们是携程机票研发团队,负责携程APP/PC端机票业务开发及创新。机票研发在搜索引擎、数据库、深度学习、高并发等方向持续不断地深入探索,持续优化用户体验,提高效率。

在机票研发,你可以和众多技术顶尖大牛一起,真实的让亿万用户享受你的产品和代码,提升全球旅行者的出行体验和幸福指数。

如果你热爱技术,并渴望不断成长,携程机票研发团队期待与你一起腾飞。目前我们前端/后台/数据/测试开发等领域均有开放职位。

简历投递邮箱:tech@ctrip.com,邮件标题:【姓名】-【携程机票】-【投递职位】。

【推荐阅读】

18fddf1ef5841a04a45d4a0f85251937.png

 “携程技术”公众号

  分享,交流,成长

大数据毕业设计PySpark+Hadoop航班延误预测系统 航班可视化 通过预测飞机票价格,并能够更好地安排航班和座位利用率,航空公司可以减少空座位和航班的浪费,从而降低碳排放和资源浪费,实现可持续发展。这对于促进航空公司数字化转型,提升数据分析和预测能力具有重要意义。通过基于Hadoop+Hive的机票价格预测分析与可视化,可以为乘客提供更好的购票体验,为航空公司提供决策支持,促进航空业的可持续发展,并推动大数据技术在航空业的应用。提高乘客购票决策:基于Hadoop的飞机票价格预测能够提供乘客准确的价格预测信息,帮助他们选择合适的购票时间和最优的价格,从而节省成本。 阅读详情

相关推荐

python爬取去哪儿网机票_GitHub - 4ilde/findtrip: 机票爬虫(去哪儿和携程网)。flight tickets multiple webspider.(scrapy + se...

Findtrip说明文档介绍Findtrip是一个基于Scrapy的机票爬虫,目前整合了国内两大机票网站(去哪儿 + 携程)IntroductionFindtrip is a webspider for flight tickets by Scrapy,which contains two major china ticket websites ---- Qua & Ctrip安装在用户目...

weixin_42602241的博客 1606

【亲测免费】 飞鸟(Flybirds): 开源自动化的翘楚

飞鸟(Flybirds)是一款前沿的自动化测试框架,专注于提供一套便捷高效的多端UI自动化测试方案。依托行为驱动开发(BDD)的设计理念,它不仅简化了测试脚本的编写流程,更通过自然语言处理技术使自动化测试的门槛大幅降低。 ### 关键特性 - **跨平台支持**:适用于Android、iOS、Web等多种终端环境,实现一次编写,多端运行。 - **框架兼容性强**:无论是React Na

gitblog_00718的博客 3583

飞机票网上订票系统javabean+jsp+mysql

1.包含源程序,数据库脚本。代码和数据库脚本都有详细注释。 2.课题设计仅供参考学习使用,可以在此基础上进行扩展完善 开发环境: 代码已经上传github,下载地址:https://github.com/21503882/airplane-ticket Eclipse ,MYSQL,JDK1.8,Tomcat 7 涉及技术点: MVC模式、SpringMvc、Mybatis、Spring、bo...

QQ21503882的博客 2129

Flybirds框架使用总结

如题

路飞 874

Android车载应用开发与分析(11)- 车载Android应用开发入门指南

将时间回退到2017年我大学刚毕业时,彼时移动互联网就已经开始退潮,各大个培训机构也纷纷停止了Android相关的培训,曾经热火朝天的应用开发从那时起,就开始走向下坡路,小程序以及众多跨平台框架也让市场对Android原生开发的需求逐年降低,市场需求的降低也造就了Android开发的面试变得史无前例的“卷”。 终于我在2019年选择离开了互联网,投身当时还不是非常火热的车载Android领域继续从事Android原生开发。而这一年中国首个外商独资的整车制造项目,“...

linkwj的博客 1万+

深入解析五大ADC芯片架构及其应用场景

本文深入解析了五大ADC芯片架构及其应用场景,包括逐次逼近型ADC、Σ-Δ型ADC、流水线型ADC、闪存型ADC和积分型ADC。通过详细的架构分析和实际应用案例,帮助工程师理解不同ADC芯片的特点和适用场景,提升电路设计效率。

weixin_28702105的博客 355

探索前沿自动化测试:CTripCorp的FlyBirds项目

探索前沿自动化测试:CTripCorp的FlyBirds项目 引言 在软件开发过程中,测试是保证质量的关键环节。随着敏捷和DevOps理念的普及,自动化测试工具的重要性日益凸显。今天,我们来一起深入了解一个由携程(CTripcorp)开源的自动化测试框架——。这个项目旨在提供一种高效、可扩展的UI自动化测试解决方案,让我们一探究竟。 项目简介 FlyBirds是一个基于Python构建的跨平台UI...

gitblog_00006的博客 649

FPGA实现16x16点阵汉字滚动显示:Verilog代码与Quartus仿真详解

本文详细介绍了如何使用FPGA实现16x16点阵汉字滚动显示,包括Verilog代码设计、Quartus仿真及硬件连接技巧。通过字模数据存储和扫描控制逻辑,实现汉字的动态显示效果,并提供了优化建议和常见问题解决方案,适合FPGA开发者和硬件爱好者学习参考。

weixin_29172963的博客 352

记录下Flybirds移动端ui自动化框架的搭建

7.IOS连接方式与安卓不太一样,需要通过tidevice连接WebDriverAgent,USB数据线连接IOS手机,运行命令:tidevice -u [设备udid] wdaproxy -B [wda的bundleid] --port 81007.IOS连接方式与安卓不太一样,需要通过tidevice连接WebDriverAgent,USB数据线连接IOS手机,运行命令:tidevice -u [设备udid] wdaproxy -B [wda的bundleid] --port 8100。

qq_33719152的博客 1121

亿佰特E77模块(STM32WLE5CCU6)LoRa通信实战指南:从配置到应用开发

本文详细介绍了亿佰特E77模块(STM32WLE5CCU6)的LoRa通信实战指南,从硬件配置到应用开发。基于ARM Cortex-M4内核的E77模块集成了LoRa射频前端,具备超低功耗和硬件级抗干扰特性,适用于智能农业、工业现场等场景。文章提供了开发环境搭建、LoRa参数配置、实战通信及性能优化等实用技巧,帮助开发者快速掌握LoRa通信技术。

weixin_29164185的博客 761

Coze:手把手教你搭建 小红书二创 智能体

前一篇 “” ,讲了如何针对需求进行拆解,并拆解 ”小红书二创“ 智能体,分为四个内容模块。通过上述步骤,开始一步一步构建 “小红书二创” 智能体。用来测试的小红书地址:http://xhslink.com/a/quxWEDAj3J48。

保持敏感!保持学习! 1436

Flybirds自动化测试框架终极指南:跨端跨平台完整教程

Flybirds是一款基于自然语言的跨端跨框架BDD UI自动化测试框架,能够帮助开发者和测试人员轻松实现多平台UI自动化测试。作为携程技术团队开源的优秀项目,Flybirds提供了完整的测试解决方案,支持Android、iOS、Web等多个平台,真正实现了一套脚本多端运行的高效测试模式。🚀 ## 为什么选择Flybirds自动化测试框架 在当今多端开发的时代,前端技术栈日益复杂,跨平台应用

gitblog_00395的博客 857

(秋招复习)一些SLAM基础

秋招复习--SLAM基础知识篇

weixin_45432823的博客 768

后悔没早知道这款UI自动化测试框架,让你写用例像口语化一样简单

携程开源的一款 UI 自动化测试框架,使用Flybirds你能够完成大部分的手机端自动化操作,基于Behave,实现BDD中“自然语言测试用例文档”和“自动化测试代码”关联需要用到支持BDD工具。说白了写测试用例可以用口语化。...

软件测试技术交流分享 2131

科研绘图系列:R语言绘制世界地图数据分布(world map)

科研绘图系列:R语言绘制世界地图数据分布(world map)

专注生信领域 527

汽车电子RTOS--AUTOSAR OS

AUTOSAR OS(AUTomotive Open System ARchitecture Operating System)是AUTOSAR(汽车开放系统架构)标准中的一个重要组件,它是一个专门为汽车电子控制单元(ECU)设计的实时操作系统(RTOS)。AUTOSAR OS旨在提供一个标准化的软件平台,以促进不同供应商和汽车制造商之间的组件复用和协同开发,提高软件质量和降低成本。

MHD0815的博客 1798

如何用Flybirds实现跨端UI自动化测试?超简单的BDD测试方案全指南

Flybirds是一款基于行为驱动开发(BDD)的**跨端UI自动化测试框架**,支持Android、iOS、Web等多平台,通过自然语言描述测试用例,让非技术人员也能轻松参与测试流程。无论是React Native还是Flutter应用,Flybirds都能实现**一套脚本多端运行**,大幅降低测试维护成本 ✨ ## ???? 核心优势:为什么选择Flybirds? ### ???? 跨端跨...

gitblog_00708的博客 536

汉书HE8,好用的汇编代码编写工具

汉书HE8,好用的汇编代码编写工具早期编写汇编代码所用功能强大

Flybirds 开源项目常见问题解决方案

Flybirds 开源项目常见问题解决方案 1. 项目基础介绍 Flybirds 是一套基于 BDD(行为驱动开发)模式的前端 UI 自动化测试框架。该项目旨在为开发者提供一种跨端跨框架的自动化测试方案,支持 Android、iOS、React Native、Flutter 以及 Web 等多端研发。主要编程语言为 Python,同时结合了 JavaScript 和一些前端技术栈。 2. 新手常见...

gitblog_00508的博客 390

Camera2Demo

在Camera2 的基础上进行封装,使得Camera2一堆初始化逻辑与Activity分离,降低耦合度,完成预览拍照并保存的操作

假人有限元模型

假人模型,车辆碰撞假人有限元模型,适合做乘员安全的研究者利用

Flybirds完全指南:从零开始掌握跨平台UI自动化测试

Flybirds是一套基于BDD模式的跨端跨框架UI自动化测试方案,提供开箱即用的工具和完善的文档支持。无论你是测试新手还是资深工程师,都能快速上手这套强大的测试框架。🚀 ## 为什么选择Flybirds? 在当今多端开发盛行的时代,前端开发面临着Web、Android、iOS、Flutter、React Native、小程序等多种平台的挑战。Flybirds应运而生,通过一套脚本多端运行的

gitblog_00068的博客 951

文档:亲测可用解决vnc灰屏,黑屏,鼠标大黑叉情况

主要解决vnc-viewer灰屏,黑屏,鼠标大黑叉等现象,详细见文档。

cucumber html模板,cucumber-html-reporter

Generates Cucumber HTML reports in three different themescucumber-html-reporterGenerate Cucumber HTML reports with pie charts Available HTML themes: ['bootstrap', 'hierarchy', 'foundation', 'simp...

weixin_30462741的博客 450

Multiple Cucumber HTML Reporter 使用指南

Multiple Cucumber HTML Reporter 使用指南 1. 项目介绍 Multiple Cucumber HTML Reporter 是一个用于 Cucumber 的报告生成模块,能够将 Cucumber 的 JSON 输出转换为美观的 HTML 报告。与其他报告模块相比,该模块具有以下特点: 提供所有测试特性和场景的快速概览。 支持多个相同特性或不同浏览器/设备上的特性运行...

gitblog_00074的博客 375

常见问题解决方案:Multiple Cucumber HTML Reporter

常见问题解决方案:Multiple Cucumber HTML Reporter 1. 项目基础介绍 Multiple Cucumber HTML Reporter 是一个用于Cucumber的 Reporting 模块,它能将Cucumber的JSON输出转换为一份精美的HTML报告。与其他报告模块的不同之处在于,这个模块提供了快速查看所有测试特性和场景的概览,支持对同一特性在不同浏览器或设备上...

gitblog_00187的博客 410

Cucumber-JVM Within SecureCI

yuahttp://www.coveros.com/cucumber-jvm-within-secureci/

楠人的博客-随风而过 1088

推荐使用cucumber-html-reporter:生成美观的Cucumber测试报告

推荐使用cucumber-html-reporter:生成美观的Cucumber测试报告 项目介绍 cucumber-html-reporter 是一个强大的开源工具,专门用于生成带有饼图的Cucumber HTML报告。它支持多种主题,包括Bootstrap、Hierarchy、Foundation和Simple,使您能够根据项目需求选择最合适的报告样式。该工具不仅提供了丰富的自定义选项,还支持...

gitblog_00497的博客 426

GoogleTest 测试框架

Google Test 框架的原理、使用

you_fathe的博客 2575
上一篇: 干货 | 携程Service Mesh可用性实践
下一篇: 《携程技术2021年度合辑》,送给爱学习的你
携程技术
博客等级 码龄10年 3716粉丝 324原创
评论 1
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值