A股上市公司传智教育(股票代码 003032)旗下技术交流社区北京昌平校区

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© 不二晨 金牌黑马   /  2019-1-3 09:30  /  1502 人查看  /  1 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

1. APP测试的准备

在进行APP测试之前,需要准备下列步骤。通过以下网站可以查找。

移动观象台:http://mi.talkingdata.com/terminals.html







1.1 确定APP的设备

选定被测试的设备终端。

记录设备的品牌
记录设备的型号
记录设备的屏幕分辨率
记录设备的屏幕大小
1.2 确定APP的版本

确定被测试的APP的版本号和操作系统类型

XXX 1.3.2 for ios
XXX 1.3.0 for Android
1.3 确定操作系统

确定运行被测试设备的操作系统

主流的有iOS和Android
还有WP(Windows Phone)
BlackBerry
Symbian
Ubuntu
1.4 准备表格记录APP的设备和版本

测试工作开始前,需要确定App需要测试的操作系统版本和设备列表

编号        OS        OS Version        分类        Model        制造商        屏幕尺寸        分辨率
001        iOS        7.1        iPhone        5s        Apple        4       
002        iOS        8.1        iPhone        6s        Apple        4.7       
003        iOS        8.0.2        iPhone        6        Apple        4.7       
004        iOS        8.1.2        iPhone        6 Plus        Apple        5.5       
005        iOS        8.0.2        iPad        Air 2        Apple        9.7       
006        iOS        8.1.2        iTouch        5        Apple        4       
007        Android        5.1        Phone        One XL        HTC        4.7        1280*720
008        Android        4.5        Phone        PRO 5        Meizu        5.7        1920*1080
009        Android        4.2        Phone        Galaxy S6        Samsung               
010        Android        4.4.2        Phone        Galaxy S5        Samsung               
011        Android        4.4.2        Phone        MX 4        Meizu               
012        Android        4.4.4        Phone        Nexus 5        Google               
013        Android        4.4.4        Phone        Mi 4        Xiaomi               
014        Android        4.2.2        Tablet        Galaxy Tab3        Samsung               
2. APP的基本测试

2.1 “移动”测试App

由于现在3G和4G网络都已经非常普及,需要优先测试App在这两种网络环境下的表现。同时需要测试4G信号无法覆盖的时候,App切换到3G、2G的环境下进行测试甚至到无网络的环境下测试。当网络恢复的时候,App是否会自动切换回来,并且执行网络断开前用户的操作。

一般可以选择在地铁、公交、电梯、隧道灯代表性的场所进行测试。

网络切换
网络恢复
一般可以选择在地铁、公交、电梯、隧道灯代表性的场所进行测试。

测试APP在网络异常的情况下,是否发生 ANR 和 Crash

2.2 App的多任务和意外情况处理

多任务切换和多任务管理界面是否与App保持一致。

多任务管理界面直接退出App程序测试。

测试App的同时接听电话,是否还能够继续使用App。

步骤:

正常打开被测APP
运行APP的功能
突然被其他应用打断(意外,短信、电话、通知)
切换到该应用、或者、忽略该应用
被测APP能够继续之前的操作,不发生ANR或者Crash
2.3 测试App的手势操作

长按屏幕呼出菜单
单手指从右向左滑动,弹出附加功能项
双手指捏合,放大放小操作等
2.4 测试App的用户体验

横屏功能测试
遵循iOS和Android的设计规范
字体大小设置以及美观
2.5 测试App的消息显示和通知显示*

通知显示的方式:

锁屏的通知:内容
下拉通知栏的通知:内容
应用程序消息栏:内容
图标的右上角角标:条数
测试要点

在安装App的时候是否申请相应的权限
验证收到App新的消息的时候,如何通过通知向用户进行消息展示
2.6 测试App能否及时显示和同步数据

Web端 + PC端 + APP端

测试在多台设备登录App,是否同步消息、设置、内容、数据等
测试App的消息是否同步在PC端(无论Web版本或者PC版本)
2.7 测试App能否响应不同的设备用户界面

测试App是否适应用户界面,必须使用真实设备进行测试。比如测试HTC Sense用户界面底部的黑色导航栏,测试小米MIUI系统桌面的角标提醒功能,测试iOS的角标提醒,测试魅族Flyme的SmartBar操作等。

非常规的控制:SmartBar
非常规的分辨率:魅族 MX4 MX3 MX2……
2.8 测试App中高内存使用的功能

测试App对于读取大量图片、视频等进行高内存占用操作的处理能力

查看App是否有对应的异步加载功能等

主要测试场景:

检查APP是否读入全部图片到内存中
美图秀秀打开图片
读取一屏的图片到内存
滚动屏幕,加载新的图片到内存
测试APP是否设定了图片加载的阀值:比如300MB
图片在内存中加载到阀值(300MB),会自动把最开始加载的指定图片占的内存空间释放
2.9 测试App的流量和电量消耗

测试App的安装文件大小
测试App占用的存储空间
测试App使用的流量和电量
流量靠软件测试
电量测试靠功耗仪
2.10 测试App的增量升级

需要测试App在自动升级或者手动增量升级后,用户数据是否保存延续等
测试App在升级失败以后,是否可以继续使用升级之前的版本。
重点测试升级后数据是否可用
2.11 测试App支持的文件格式

测试App支持Office文件操作
测试App支持图片文件展示
测试App支持PDF文件打开
测试App支持视频和音频文件播放
2.12 安装卸载测试

不联网的情况下,会不会崩溃
在线下载数据不完整,能否再次启动
是否支持断点续传
下载安装后再次启动
安装成功后检查版本号和相关数据
2.13 应用召唤

不同应用之间的应用召唤

测试步骤:

【支付宝支付】

打开被测试的应用程序APP
使用APP指定的功能
APP支付选择“支付宝”
测试是否提示“允许打开支付宝”(iOS测试)
测试支付宝没有安装的情况下,APP是否有正确提示(未安装支付宝)
测试支付宝正确安装的情况下,未登录支付宝,是否提示登录页面
测试支付宝正确安装的情况下,已登录支付宝,是否提示支付页面
3. 易测EasyTest

易测是一款基于无线客户端研发场景的通用测试工具, 它通过在研发人员的自持机上提供各种辅助能力&标准化的专项测试服务来提升研发质量&效率。

易测:http://mqc.aliyun.com/download.htm?spm=0.0.0.0.LKnIoR

实时性能数据
弱网环境模拟
手机抓包
Monkey测试
截图断网等


4. ADB命令与Monkey工具

4.1 ADB 命令

adb:
adb 的全称为Android Debug Bridge,就是起到调试桥的作用。通过adb我们可以在Eclipse中方面通过DDMS来调试Android程序,说白了就是debug工具。adb的工作方式比较特殊,采用监听Socket TCP 5554等端口的方式让IDE和Qemu通讯,默认情况下adb会daemon相关的网络端口,所以当我们运行Eclipse或Android Studio时adb进程就会自动运行。
借助adb工具,我们可以管理设备或手机模拟器的状态。还可以进行很多手机操作,如安装软件、系统升级、运行shell命令等等。其实简而言说,adb就是连接Android手机与PC端的桥梁,可以让用户在电脑上对手机进行全面的操作
adb 在sdk的platform-tools目录中

Android SDK 下载网站 http://www.androiddevtools.cn/(非官方)

ADB 是连接 Windows 命令行(也可以是Linux或者Mac)到 Andriod手机(模拟器)的Android操作系统的 桥梁(调试桥)



ADB的测试环境搭建:

安装 JDK
安装 Android SDK Tool
安装 Android SDK 相关手机驱动


然后打开 Windows 命令窗口

cd C:\Users\Linty\AppData\Local\Android\android-sdk\platform-tools
1
ADB连接夜神模拟器示例:

ADB环境的搭建步骤(连接夜神模拟器):

打开Android模拟器(夜神模拟器)
也可以打开Android手机(已经ROOT),在勾选“允许USB调试”的选项后,连接手机

解压缩 platform-tools_r22-windows.zip 到 C:\

打开 cmd

进入解压后的文件夹

cd C:\platform-tools_r22-windows\platform-tools
1
连接夜神模拟器

adb connect 127.0.0.1:62001
1
连接成功后,提示 connected to 127.0.0.1:62001

进入 ADB Shell 模式

adb shell
1
成功后,进入ADB 的SHELL模式

root@android:/ #
1
ADB的两种模式:

前提:必须连接上 Android, adb connect
模式一:进入 ADB SHELL 模式 adb shell
类似于 Linux系统的操作
ls
cp
cd
mv
rm
cp
模式二:直接 adb + 命令 来执行 ADB命令

如果已经进入 ADB SHELL模式,需要先 exit
adb install + apk 文件在windows上的路径
adb unistall + apk 的包名
adb pull 拉,把文件从Android下载到windows中
adb push 推,把windows文件放到Android中

adb连接前
显示当前运行的全部连接到当前电脑的设备,包括手机和模拟器等:

adb devices
1
连接指定的模拟器或设备

adb connect 127.0.0.1:62001
1
断开指定的模拟器或设备

adb disconnect
1
启动ADB

adb start-server
1
关闭ADB

adb kill-server
1
进入 adb的shell环境
进入adb的shell环境

adb shell
1
查看包名

adb shell
root@android:/ # ls data/data
1
2
记录无线通讯日志

adb shell
root@android:/ # logcat -b radio
1
2
删除系统应用

adb shell
root@android:/ # cd system/app
root@android:/ # rm xxxx.apk
1
2
3
退出adb的shell环境

root@android:/ # exit
1
adb命令模式
安装应用程序

adb install -r C:\xxxxx.apk
1
获取设备中的文件

adb pull <remote> <local>
adb pull /addroid/lib/libwebcore.so c:\tmp
1
2
向设备中写入文件

adb push <local> <remote>
adb push C:\test.txt /tmp/test.txt
1
2
卸载应用程序

adb shell
cd data/app
rm apk包
exit
adb uninstall apk包的主包名
1
2
3
4
5
获取管理员权限

adb root
1
获取设备的序列号

adb get-serialno
1
进入SQLite环境

adb shell
sqlite3
1
2
SQLite的基本操作,SQLite没有用户的概 念 。



示例:安装TPshop的Android客户端

步骤如下:

用ADB连接上设备

adb connect 127.0.0.1:62001
1
用ADB的方式安装APP

adb install -r C:\tmp\soubaoShopMobile-debug.apk
1
安装成功,在ADB SHELL环境中 执行 Monkey(压力测试工具)


# 进入 ADB SHELL 环境

adb shell

# 获取 TPSHOP 的APP的包名

root@android:/ # ls data/data | gerp soubao
com.soubao.tpshop

# 执行 Monkey

root@android:/ #                                                 monkey -p com.soubao.tpshop -v -v -v 5000 -throttle 5000 --pct-motion 80% > sdcard/monkey_tpshop.log
1
2
3
4
5
6
7
8
9
10
11
12
13


用ADB 获取日志到本地C盘的tmp目录中


# 退出 ADB SHELL 环境

root@android:/ # exit

# 用 ADB PULL 获取文件

adb pull sdcard/monkey_tpshop.log
[100%] sdcard/monkey_tpshop.log
1
2
3
4
5
6
7
8
9


用ADB的方式卸载

adb shell
root@android:/ # ls data/data | grep soubao

# 获取到 app的包名

com.soubao.tpshop

# 退出 adb shell

root@android:/ # exit
adb uninstall com.soubao.tpshop
1
2
3
4
5
6
7
8
9
10
11


4.2 Monkey 工具

Monkey测试是Android平台自动化测试的一种手段,通过Monkey程序模拟用户触摸屏幕、滑动Trackball、按键等操作来对设备上的程序进行压力测试,检测程序多久的时间会发生异常。
顾名思义,Monkey就是猴子,  Monkey测试,就像一只猴子, 在电脑面前,乱敲键盘在测试。  猴子什么都不懂, 只知道乱敲,通过Monkey程序模拟用户触摸屏幕、滑动Trackball、 按键等操作来对设备上的程序进行压力测试,检测程序多久的时间会发生异常

Monkey 主要用于Android 的压力测试  自动的一个压力测试小工具, 主要目的就是为了测试app 是否会Crash.

Monkey程序由Android系统自带,使用Java语言写成,在Android文件系统中的存放路径是:/system/framework/monkey.jar;
Monkey.jar程序是由一个名为“monkey”的Shell脚本来启动执行,shell脚本在Android文件系统中的存放路径是:/system/bin/monkey;
可以在命令行中输入

这样就可以通过在CMD窗口中执行: adb shell monkey {+命令参数}来进行Monkey测试了。



查看Monkey命令帮助

adb shell monkey –help
1
类别        选项        说明
常规        –help        列出简单的用法。
-v        命令行的每一个 -v 将增加反馈信息的级别。 Level 0( 缺省值 ) 除启动提示、测试完成和最终结果之外,提供较少信息。 Level 1 提供较为详细的测试信息,如逐个发送到 ActivITy 的事件。 Level 2提供更加详细的设置信息,如测试中被选中的或未被选中的Activity 。       
事件        -s        伪随机数生成器的seed 值。如果用相同的 seed 值再次运行 Monkey ,它将生成相同的事件序列。
–throttle        在事件之间插入固定延迟。通过这个选项可以减缓 Monkey 的执行速度。如果不指定该选项, Monkey 将不会被延迟,事件将尽可能快地被产成。       
–pct-touch        调整触摸事件的百分比(触摸事件是一个down-up事件,它发生在屏幕上的某单一位置)。       
–pct-motion        调整动作事件的百分比(动作事件由屏幕上某处的一个down事件、一系列的伪随机事件和一个up事件组成)。       
–pct-trackball        调整轨迹事件的百分比(轨迹事件由一个或几个随机的移动组成,有时还伴随有点击)。       
–pct-nav        调整“基本”导航事件的百分比(导航事件由来自方向输入设备的up/down/left/right组成)。       
–pct-majornav        调整“主要”导航事件的百分比(这些导航事件通常引发图形界面中的动作,如:5-way键盘的中间按键、回退按键、菜单按键)       
–pct-syskeys        调整“系统”按键事件的百分比(这些按键通常被保留,由系统使用,如Home、Back、Start Call、End Call及音量控制键)。       
–pct-appswitch        调整启动Activity的百分比。在随机间隔里,Monkey将执行一个startActivity()调用,作为最大程度覆盖包中全部Activity的一种方法。       
–pct-anyevent        调整其它类型事件的百分比。它包罗了所有其它类型的事件,如:按键、其它不常用的设备按钮、等等。       
约束限制        -p        如果用此参数指定了一个或几个包,Monkey将只允许系统启动这些包里的Activity。如果你的应用程序还需要访问其它包里的Activity(如选择取一个联系人),那些包也需要在此同时指定。如果不指定任何包,Monkey将允许系统启动全部包里的Activity。要指定多个包,需要使用多个 -p选项,每个-p选项只能用于一个包。
-c        如果用此参数指定了一个或几个类别,Monkey将只允许系统启动被这些类别中的某个类别列出的Activity。如果不指定任何类别,Monkey将选择下列类别中列出的Activity:Intent.CATEGORY_LAUNCHER或Intent.CATEGORY_MONKEY。要指定多个类别,需要使用多个-c选项,每个-c选 项只能用于一个类别。       
调试        –dbg-no-events        设置此选项,Monkey将执行初始启动,进入到一个测试Activity,然后不会再进一步生成事件。为了得到最佳结果,把它与-v、一个或几个包约束、以及一个保持Monkey运行30秒或更长时间的非零值联合起来,从而提供一个环境,可以监视应用程序所调用的包之间的转换。
–hprof        设置此选项,将在Monkey事件序列之前和之后立即生成profiling报告。这将会在data/misc中生成大文件(~5Mb),所以要小心使用它。       
–ignore-crashes        通常,当应用程序崩溃或发生任何失控异常时,Monkey将停止运行。如果设置此选项,Monkey将继续向系统发送事件,直到计数完成。       
–ignore-timeouts        通常,当应用程序发生任何超时错误(如“Application Not Responding”对话框)时,Monkey将停止运行。如果设置此选项,Monkey将继续向系统发送事件,直到计数完成。       
–ignore-security-exceptions        通常,当应用程序发生许可错误(如启动一个需要某些许可的Activity)时,Monkey将停止运行。如果设置了此选项,Monkey将继续向系统发送事件,直到计数完成。       
–kill-process-after-error        通常,当Monkey由于一个错误而停止时,出错的应用程序将继续处于运行状态。当设置了此选项时,将会通知系统停止发生错误的进程。注意,正常的(成功的)结束,并没有停止启动的进程,设备只是在结束事件之后,简单地保持在最后的状态。       
–monitor-native-crashes        监视并报告Android系统中本地代码的崩溃事件。如果设置了–kill-process-after-error,系统将停止运行。       
–wait-dbg        停止执行中的Monkey,直到有调试器和它相连接。       
实际使用的时候 Monkey的 -p -v -throttle –pct-motion 使用比较多

下面一个实例
adb shell
ls data/data
monkey -p im.tower.android -v -v -v 5000 -throttle 500 --pct-motion 80% > sdcard\monkey.log
1
2
3
使用monkey进行Tower的压力测试,使用级别2,操作5000个随机命令,并且每个命令延迟5秒钟,滑动的命令占80%。

日志分析
正常情况, 如果Monkey测试顺利执行完成, 在log的最后, 会打印出当前执行事件的次数和所花费的时间;

// Monkey finished 代表执行完成\
1
异常情况

Monkey 测试出现错误后,一般的分析步骤
看Monkey的日志 (注意第一个swith以及异常信息等)
1. 程序无响应的问题: 在日志中搜索 “ANR”
2. 崩溃问题:在日志中搜索 “Exception” (如果出现空指针, NullPointerException) 肯定是有bug

Monkey 执行中断, 在log最后也能看到当前执行次数

5. 安全测试

APP请求的权限(摄像头、通讯录、通话记录、短信、定位、蓝牙、WiFi、相册)是否有应用场景
APP的消息显示(锁屏消息提醒、消息栏、图标的角标、最近通知的消息提醒)的关闭和开启
主要的测试内容:

易测安全扫描:上传APP到易测平台,由阿里云扫描并发报告。
权限的测试:
检查APP申请的权限,列出所有权限
对所有的权限进行场景描述
消息的控制:
显示消息的形式
显示消息的时机(锁屏是否显示)
6. APP移动测试框架

随着移动互联网的发展,移动测试技术越来越成熟,很多优秀的开源测试框架涌现出来。作为一个移动测试工程师,我们不仅要夯实自己的技术能力,也要学会从开源框架吸取经验。俗话说,站在巨人的肩膀上,我们会看得更远。移动端的测试框架主要分为自动化测试框架,性能测试框架,稳定性测试框架和安全测试框架这几种类型。下面我们分这几个类型介绍10个最常用的移动端测试框架。

6.1 自动化测试框架

1)Appium
官方网站:http://appium.io/
Github下载地址:https://github.com/appium/appium
说到移动端的自动化框架,最有名的当属Appium。Appium是一个开源的跨平台移动端UI自动化测试框架,它支持native,hybrid和web app的测试。目前有超过100个贡献者在github上维护和优化Appium的源代码。关于Appium的中文资料也非常多,比较齐全的是乙醇的博客,总结了11篇博文介绍Appium的用法,可以访问http://www.cnblogs.com/nbkhic/tag/appium/ 来查看。另外在testerhome上也有专门针对Appium的讨论社区,在上面你可以跟各种行业大牛沟通和交流。https://testerhome.com/topics/node23

2) 百度Cafe
官方网站:http://baiduqa.github.io/Cafe/
Github下载地址:https://github.com/BaiduQA/Cafe
Cafe,是一款来自百度QA部门的Android平台自动化测试框架,框架覆盖了Android自动化测试的各种需求,致力于实现跨进程测试、快速测试、深度测试,解决了Android自动化测试中的诸多难题,比如业界一直没有解决的跨进程测试问题。主要亮点有:基于hook录制体系,遍历测试,跨app测试,pc agent设计,使用android 漏洞提权。

3)阿里Athrun
Github下载地址:https://github.com/taobao-chenxu/athrun-framework
Athrun 无线测试框架是淘宝自动化测试团队开发的UI自动化测试框架,支持Android和iOS移动App的UI自动化测试。Athrun以Mobile自动化为基础,以PC2Mobile为切入点,是淘宝Mobile测试日常工作必备的平台。目前Athrun支持:Android上的自动化测试,包括自动化测试框架,持续集成体系。覆盖率工具和自动录制回放工具,也在试用完善中。iOS上的自动化测试,包括注入式自动化框架AppFramework,和基于录制的非注入式自动化框架Athrun_IOS,还有持续集成体系。目前两个框架在淘宝测试内都有用户群,都还在不断使用和演进过程中。AppFramework将会支持socket通信方式。

6.2 性能测试框架

1)网易Emmagee
Github下载地址:https://github.com/NetEase/Emmagee
Wiki: https://github.com/NetEase/Emmagee/wiki
Issues: https://github.com/NetEase/Emmagee/issues
FAQ: https://github.com/NetEase/Emmagee/wiki/FAQ
Emmagee是一个实用的手工Android端性能测试工具,它可以实时监控Android App的CPU,内存,网络流量,电量等。如果手机Root的话,还可以监控top activity及堆信息。此外,它还能根据用户需要设置收集数据的时间间隔。最终以csv文件的方式将报告保存在本地。

2)腾讯APT
Github下载地址:https://github.com/stormzhang/APT
Tencent APT Mirror, APT是一个Android平台高效性能测试组件,提供丰富实用的功能,适用于开发自测、定位性能瓶颈;测试人员完成性能基准测试、竞品对比测试。APT是一个eclipse插件,可以实时监控Android手机上多个应用的CPU、内存数据曲线,并保存数据;另外还支持自动获取内存快照、PMAP文件分析等,方便开发人员自测或者测试人员完成性能测试,快速发现产品问题。

6.3 稳定性测试框架

1)CrashMonkey4IOS
Github下载地址:https://github.com/vigossjjj/CrashMonkey4IOS
CrashMonkey4IOS是一个iOS稳定性测试工具。它主要支持以下功能:

支持真机测试、模拟器测试;
支持收集系统日志(Systemlog)、崩溃日志(Crashlog)、instrument行为日志
支持测试报告截图,绘制行为轨迹
支持测试设备信息收集
使用最新版的UIAutoMonkey,加入UI Holes与Application Not Repsonding (“ANR”)的处理,添加custom.js作为入口脚本.加入tuneup依赖
修改UIAutoMonkey.js中截图策略,为每个Event Action进行截图
支持测试执行过程中App进入后台,自动恢复
2)CrashMonkey4Android
Github下载地址:https://github.com/DoctorQ/CrashMonkey4Android
CrashMonkey4Android,是一个依靠Cts框架,对原生Monkey进行改造后的产物,拥有以下新增功能:

保存每一步的截图.
保存logcat.
保存每一个Monkey事件的信息.
分析Crash.
Html报告.
支持多设备.
3)ui-auto-monkey
Github下载地址:https://github.com/jonathanpenn/ui-auto-monkey
UI AutoMonkey是一个简单的面向iOS应用程序的压力测试插件框架。 你可以通过它向你的应用程序连续发出一系列随机的点击,滑动,旋转屏幕,锁屏,解锁等事件。同时它会通过instrument对你的App的性能状况进行实时监控。当应用程序发生crash,它会收集相关的crash日志并存储在本地。

6.4 安全测试框架

1)Mobile-Security-Framework-MobSF
Github下载地址:https://github.com/penghaibo203/Mobile-Security-Framework-MobSF
Mobile Security Framework (移动安全框架) 是一款智能、一体化的开源移动应用(Android/iOS)自动渗透测试框架,它能进行静态、动态的分析。

静态分析器可以执行自动化的代码审计、检测不安全的权限请求和设置,还可以检测不安全的代码,诸如ssl绕过、弱加密、混淆代码、硬编码的密码、危险API的不当使用、敏感信息/个人验证信息泄露、不安全的文件存储等。
动态分析器可以在虚拟机或者经过配置的设备上运行程序,在运行过程中检测问题。动态分析器可以从抓取到的网络数据包、解密的HTTPS流量、程序dump、程序日志、程序错误和崩溃报告、调试信息、堆栈轨迹和程序的设置文件、数据库等方面进行进一步的分析。
该框架支持二进制文件(APK & IPA)和源码压缩包。该框架的另一个特点是其可扩展性,你可以轻松制定自定义规则。测试结束后程序会生成一份清晰的报告。我们会进一步拓展次框架以支持Tizen、WindowsPhone等平台。
---------------------
转载,仅作分享,侵删
作者:立师兄Linty
原文:https://blog.csdn.net/lintyleo/article/details/79362474


1 个回复

倒序浏览
奈斯,加油
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马