作业帮 > 体裁作文 > 教育资讯

monkeyrunner

来源:学生作业帮助网 编辑:作业帮 时间:2024/09/24 19:21:38 体裁作文
monkeyrunner体裁作文

篇一:Monkeyrunner使用方法和实例

目前android SDK里自带的现成的测试工具有monkey 和 monkeyrunner两个。大家别看这俩兄弟名字相像,但其实是完完全全不同的两个工具,应用在不同的测试领域。总的来说,monkey主要应用在压力和可靠性测试上,运行该命令可以随机地向目标程序发送各种模拟键盘事件流,并且可以自己定义发送的次数,以此观察被测应用程序的稳定性和可靠性,应用起来也比较简单,记住那几个命令就行了。而monkeyrunner呢,相比之下会强大一些,它主要可应用于功能测试,回归测试,并且可以自定义测试扩展,灵活性较强,并且测试人员可以完全控制。

本篇乃本人学习monkeyrunner时笔记,查看网络中的资料并经本人测试而出,由于本人刚接触,所以本篇内容不免肤浅,高手们请绕走~

在测试本人以下实例时,请自行搭建Android环境。

一、打开模拟器

运行monkeyrunner之前必须先运行相应的模拟器,不然monkeyrunner无法连接设备。 用Elipse打开Android模拟器或在CMD中用Android命令打开模拟器。这里重点讲一下在CMD中用Android命令打开模拟器

命令:emulator -avd test (注意:test为虚拟设备的名称——AVD的全称为:Android Virtual Device,就是Android运行的虚拟设备,如下图所示:)

上面命令中的test是模拟器名称。使用时需要改成实际名字。

如果正常,模拟器应该可以启动起来了。

如果执行的结果出现以下错误内容:

[plain] view plaincopy 1. PANIC: Could not open: C:\Documents and Settings\sAdministrator\.android/avd/test.ini

如下图所示:

原因在于你的环境变量缺少配置。请在“系统变量”中添加“ANDROID_SDK_HOME”,设置其值为“C:\Documents and Settings\Administrator”(注意:这里的值不能为C:\Documents and Settings\Administrator\.android),如下图所示:

确定后,关闭CMD窗口,重新打开CMD。执行以上命令。将会启用模拟器。

模拟器启动成功后,我们仍在CMD环境中操作。现在进入monkeyrunner的shell命令交互模式。

命令:monkeyrunner

进入shell命令交互模式后,首要一件事就是导入monkeyrunner所要使用的模块。直接在shell命令下输入:

from com.android.monkeyrunner import

MonkeyRunner,MonkeyDevice 回车

OK,这步完成我们就可以利用monkeyrunner进行测试工作了。

这里有两种方案,一是直接在shell命令下输入以下命令;

命令说明

device=MonkeyRunner.waitForConnection() #连接手机设备

device.installPackage("../samples/android-10/ApiDemos/bin/Apidemos.apk") #安装apk包到手机设备。

启动其中的任意activity了,只要传入package和activity名称即可。命令如下:

device.startActivity(component="com.example.android.apis/com.example.android.apis.ApiDemos")

此时模拟器会自动打开ApiDemos这个应用程序的主页。

device.reboot() #手机设备重启 device.touch(300,300,'DOWN_AND_UP')

MonkeyRunner.alert("hello")#在emulator上会弹出消息提示

device.press('KEYCODE_HOME',MonkeyDevice.DOWN_AND_UP)

device.type('hello')#向编辑区域输入文本'hello'

二是将以下命令写到python文件里,例如test.py,然后我们再从命令行直接通过

monkeyrunner运行它即可。比如,我们还是用上面的例子,语法如下:monkeyrunner test.py 接下来monkeyrunner会自动调用test.py,并执行其中的语句,相当方便。

实例:test.py

[python] view plaincopy

1. from com.android.monkeyrunner import MonkeyRunner,MonkeyDevice

2. device=MonkeyRunner.waitForConnection()

3. device.startActivity(component="your.www.com/your.www.com.TestActivity

")

在CMD中执行

monkeyrunner test.py

可能出现错误“Can't open specified script file”,如下图所示:

篇二:MonkeyRunner学习笔记

MonkeyRunner初学笔记

今天研究了一下安卓自动化的另外一种工具,MonkeyRunner,MonkeyRunner是android SDK 中自带的测试工具,因为之前用了robotium所以环境几乎不需要搭建,也不需要下载什么东西就可以使用了,但是因为对这个工具的不熟悉所以在cmd命令下进行操作的时候还是有很多的问题。自己根据网上的资料总结的,高手绕道。

1:配置android path 环境变量,如下图:

2.接下来:通过cmd命令来打开模拟器:

命令如下:emulator –avdAndroidTest(这个是模拟器的名字,如下图

)

不出意外的话模拟器应该打开了;

3.进入MonkeyRunner的shell下

输入命令行:monkeyrunner,如下图结果就表示进去了;

4. 引入MonkeyRunner的几个包:>>>from

com.android.monkeyrunner.importMonkeyRunner,MonkeyDevice,MonkeyImage

>>>device=MonkeyRunner.waitForConnection() #连接手机设备

5.>>>device.installPackage(“.apk文件的路径”)(这里有问题需要注意,已经在图中标示出来)

在这个操作中,我安装到模拟器中的是”XX.apk”,在安装之前我已经把模拟器上原先有的”XX.apk”,卸载掉了,经过上述操作后,安装成功。

6.接下来应该对模拟器进行操作了;

>>>device.startActivity(component=”your.www.com/your.www.com.TestActivity”)(这句话一直没了解,但是component是命令,后面双引号里面的应该是可以变的。)

>>>device.press(‘KEYCODE_HOME’,MonkeyDevice.DOWN_AND_UP)(按下Home键,已经实现了这个操作)

今天使用MonkeyRunner就做了这些简单的操作,我不知道该如何在cmd中利用

MonkeyRunner的命令来启动””XX.apk”,”,研究了一些教程,不大能看懂,但是在教程中都提到了”ApiDemos”这个东西,于是我查了一下,发现这个是android SDK中自带的android的例子,所以我就试着运行了这个程序并将它打包,以便于我跟着教程继续学习MonkeyRunner如何使用。

这个不运行也成。

PS:运行SDK中自带的ApiDemos;可能会有问题,以下是可能的(我遇到的)问题和解决方案。

下图是我打包ApiDemos以后的生成的ApiDemos.apk和它的路径:

接下来:

fromcom.android.monkeyrunner importMonkeyRunner,MonkeyDevice

篇三:monkeyRunner教程

Android自动测试之monkeyrunner工具

monkeyrunner工具

前言:

最近开始研究Android自动化测试方法,对其中的一些工具、方法和框架做了一些简单的整理,其中包括android测试框架、CTS、Monkey、Monkeyrunner、benchmark、其它test tool等等。因接触时间很短,很多地方有不足之处,希望能和大家多多交流。

一、什么是monkeyrunner

monkeyrunner工具提供了一个API,使用此API写出的程序可以在Android代码之外控制Android设备和模拟器。通过monkeyrunner,您可以写出一个Python程序去安装一个Android应用程序或测试包,运行它,向它发送模拟击键,截取它的用户界面图片,并将截图存储于工作站上。monkeyrunner工具的主要设计目的是用于测试功能/框架水平上的应用程序和设备,或用于运行单元测试套件,但您当然也可以将其用于其它目的。

二、monkeyrunner工具同Monkey工具的差别

Monkey:

Monkey工具直接运行在设备或模拟器的adb shell中,生成用户或系统的伪随机事件流。 monkeyrunner:

monkeyrunner工具则是在工作站上通过API定义的特定命令和事件控制设备或模拟器。

三、monkeyrunner的测试类型

1、多设备控制:monkeyrunner API可以跨多个设备或模拟器实施测试套件。您可以在同一时间接上所有的设备或一次启动全部模拟器(或统统一起),依据程序依次连接到每一个,然后运行一个或多个测试。您也可以用程序启动一个配置好的模拟器,运行一个或多个测试,然后关闭模拟器。

2、 功能测试: monkeyrunner可以为一个应用自动贯彻一次功能测试。您提供按键或触摸事件的输入数值,然后观察输出结果的截屏。

3、 回归测试:monkeyrunner可以运行某个应用,并将其结果截屏与既定已知正确的结果截屏相比较,以此测试应用的稳定性。

4、 可扩展的自动化:由于monkeyrunner是一个API工具包,您可以基于Python模块和程序开发一整套系统,以此来控制Android设备。除了使用monkeyrunner API之外,您还可以使用标准的Python os和subprocess模块来调用Android Debug Bridge这样的Android工具。

四、运行monkeyrunner

您可以直接使用一个代码文件运行monkeyrunner,抑或在交互式对话中输入monkeyrunner语句。不论使用哪种方式,您都需要调用SDK目录的tools子目录下的monkeyrunner命令。如果您提供一个文件名作为运行参数,则monkeyrunner将视文件内容为Python程序,并加以运行;否则,它将提供一个交互对话环境。

monkeyrunner的命令语法为:

monkeyrunner -plugin

五、实例

以sample中的ApiDemos为例,先将其生成ApiDemos.apk。

前提:已有device连接

1、 将ApiDemos.apk放在$Android_Root\tools下。

2、 在$Android_Root\tools下新建一个monkeyrunnerprogram.py文件,里面内容为: 1 # Imports the monkeyrunner modules used by this program 2

3 from com.android.monkeyrunner import MonkeyRunner, MonkeyDevice, MonkeyImage

4

5 # Connects to the current device, returning a MonkeyDevice object

6

7 device = MonkeyRunner.waitForConnection()

8

9 # Installs the Android package. Notice that this method returns a boolean, so you can test

10

monkeyrunner

11 # to see if the installation worked.

12

13 device.installPackage('./ApiDemos.apk')

14

15

16 # Runs the component

17

18 device.startActivity(component='com.example.android.apis/.ApiDemos')

19

20

21 # Presses the Menu button

22

23 device.press('KEYCODE_MENU','DOWN_AND_UP')

24

25

26 # Takes a screenshot

27

28 result = device.takeSnapshot()

29

30

31 # Writes the screenshot to a file

32

33 result.writeToFile('./shot1.png','png')

注意:SDK上的例子有些错误,不可直接复制,否则执行命令时会发生错误。具体可与我的上面这段代码对照。

3、 打开命令行转到Android_Root\tools目录下运行一下命令:

monkeyrunner monkeyrunnerprogram.py

110307 15:33:19.625:I [main] [com.android.monkeyrunner.MonkeyManager] Monkey Command: wake.

110307 15:33:20.625:I [main] [com.android.monkeyrunner.MonkeyManager] Monkey Command: wake.

110307 15:33:21.625:I [main] [com.android.monkeyrunner.MonkeyManager] Monkey Command: wake.

110307 15:33:22.718:S [pool-1-thread-1]

[com.android.monkeyrunner.adb.AdbMonkeyDevice] Error starting command: monkey --port 12345

110307 15:33:22.718:S [pool-1-thread-1]

[com.android.monkeyrunner.adb.AdbMonkeyDevice]com.android.ddmlib.ShellCommandUnresponsiveException

110307 15:33:22.718:S [pool-1-thread-1]

[com.android.monkeyrunner.adb.AdbMonkeyDevice] at

com.android.ddmlib.AdbHelper.executeRemoteCommand(AdbHelper.java:408) 110307 15:33:22.718:S [pool-1-thread-1]

[com.android.monkeyrunner.adb.AdbMonkeyDevice] at

com.android.ddmlib.Device.executeShellCommand(Device.java:276)

110307 15:33:22.718:S [pool-1-thread-1]

[com.android.monkeyrunner.adb.AdbMonkeyDevice] at

com.android.monkeyrunner.adb.AdbMonkeyDevice$1.run(AdbMonkeyDevice.java:89)

110307 15:33:22.718:S [pool-1-thread-1]

[com.android.monkeyrunner.adb.AdbMonkeyDevice] at

java.util.concurrent.Executors$RunnableAdapter.call(UnknownSource)

110307 15:33:22.718:S [pool-1-thread-1]

[com.android.monkeyrunner.adb.AdbMonkeyDevice] at

java.util.concurrent.FutureTask$Sync.innerRun(Unknown Source)

110307 15:33:22.718:S [pool-1-thread-1]

[com.android.monkeyrunner.adb.AdbMonkeyDevice] at

java.util.concurrent.FutureTask.run(Unknown Source)

110307 15:33:22.718:S [pool-1-thread-1]

[com.android.monkeyrunner.adb.AdbMonkeyDevice] at

java.util.concurrent.ThreadPoolExecutor$Worker.runTask(Unknown Source) 110307 15:33:22.718:S [pool-1-thread-1]

[com.android.monkeyrunner.adb.AdbMonkeyDevice] at

java.util.concurrent.ThreadPoolExecutor$Worker.run(UnknownSource)

110307 15:33:22.718:S [pool-1-thread-1]

[com.android.monkeyrunner.adb.AdbMonkeyDevice] at

java.lang.Thread.run(UnknownSource)

110307 15:33:57.437:I [main] [com.android.monkeyrunner.MonkeyManager] Monkey Command: press KEYCODE_MENU.

110307 15:33:59.171:I [main] [com.android.monkeyrunner.MonkeyManager] Monkey Command: quit.

注:里面exception的提示我们可以忽略,因为我们可以看见 Monkey Command: press KEYCODE_MENU已经执行成功。

4、 可以Android_Root\tools下查看生成的shot1.png的截图。

六、实例扩展

因为ApiDemos首页上按下MENU键没有菜单出现,为了更加形象化,在实例五的基础上继续试验:

1、 在$Android_Root\tools下新建一个monkeyrunnerprogram1.py文件,里面内容为: 1 # Imports the monkeyrunner modules used by this program 2

篇四:monkey和monkeyrunner学习笔记bd

1.按照网上安装教程安装好android虚拟机

2.把D:\android-sdk-windows\tools加入到系统环境变量path

3.启动模拟器,命令行打入 emulator -avd SKD4.0,其中SKD4.0是模拟机名

4.在虚拟机上安装app,在cmd打入adb install "D:\download\qq2013.apk"

5.设置代理

后来找到另外一个办法。

启动模拟器,然后进入 settings->Wireless controls->Mobile networks->Access Point Names 然后打开出现在列表中的access point;

然后下面这样设置:

- Proxy : your proxy address

- Port : your proxy port

6.使用monkey,Monkey测试是一种为了测试软件的稳定性、健壮性的快速有效的方法。

安装好被测app后,打入以下命令。

adb shell

#cd data

#ls data

以上命令会列出我们能测试的应用程序包的名字,找到后,打

#monkey -p com.android.calculator2 -v 500

执行测试。其中 com.android.calculator2 是测试app安装后package的名称。

-v 后面接的是伪事件个数。

7.monkeyrunner

1)下载安装python,网上下载Python_3.2.2_XiaZaiBa.zip,直接安装即可。

2)配置环境变量path,D:\Python32

3)启动模拟器

4)我们打开另一个CMD窗口(前一个不要关),还是定位到tools目录,输入命令"monkeyrunner"

5)打入命令

from com.android.monkeyrunner import MonkeyRunner, MonkeyDevice

device = MonkeyRunner.waitForConnection()

6)安装app,device.installPackage("D:\download\zuoche.apk")

zuoche.apk安装后,包的名字为com.ourlinc

7)启动测试app

device.startActivity(component=

“com.example.android.apis/com.example.android.apis.ApiDemos")

启动qq

device.startActivity(component=

"com.tencent.mobileqq/com.tencent.mobileqq.activity.SplashActivity")

启动坐车网

device.startActivity(component = "com.ourlinc/com.ourlinc.ui.WelcomeActivity")

device.startActivity('packageName/startActivity')

查看应用包package和activity名称

1.切换到Android SDK 的platform-tools目录下,例如: D:\android-sdk-windows\platform-tools 如果把“D:\android-sdk-windows\platform-tools”加入到环境变量path,可省下切换到目录步骤。

2. 查看apk的版本号等信息,

aapt dump badging D:\download\qq2013.apk

可以看出安装包的package名称com.tencent.mobileqq

可以看出安装包的activity名称 com.tencent.mobileqq.activity.SplashActivity

8)链接真实手机设备

在cmd命令行打adb devices 查看adb链接设备

adb devices

List of devices attached

0a843082428021d7_MTPADB device

emulator-5554 device

from com.android.monkeyrunner import MonkeyRunner,MonkeyDevice

device=MonkeyRunner.waitForConnection(5,'0a843082428021d7_MTPADB')

device=MonkeyRunner.waitForConnection(5,'手机名')

5是链接等待时间

9)monkeyrunner运行脚本

在cmd命令行打入

monkeyrunner E:\spring\android模拟器\monkeyrunner\recorder.py

10)使用执行monkey_recorder.py记录要点击的屏幕坐标,以供写monkeyrunner脚本用。

需要把monkey_recorder.py放D:\android-sdk-windows\tools目录下,本人觉得monkey_playback.py没什么用,不做介绍。英语能力强的,还可以看下monkeyrunner的帮助文档。

总结:monkey向被测app发送一堆不可控的命令流,适合与性能和稳定性测试。Monkey的安装使用相对简单。Monkeyrunner,可按用户编写的命令执行,不足的是无法获取被测app状态及信息。由于模拟器容易链接中断等原因,建议学习monkeyrunner链接使用真实手机(手机设置启动usb调试,adb功能,用数据线链接即可)。

篇五:monkeyrunnerAPI

MonkeyRunner

string alert ( string message, string title, string okTitle)

当前程序运行过程中显示一个警告对话框。对话框是模态,因此该计划将暂停,直到用户点击对话框的按钮。

参数

message 在对话框中显示的消息。

title 对话框的标题。默认值是“Alert(警报)”。

okTitle 在对话框中的按钮显示的文本。默认值是“OK”。

integer choice (string message, iterable choices, string title)

显示当前程序运行过程的选项列表“对话框 对话框是模态,使程序暂停,直到用户点击对话框的按钮之一。

参数

message 显示在对话框的提示消息。

choices 一个Python迭代包含一个或多个显示为字符串的对象。建议的形式是一个字符串数组。

title 对话框的标题。默认的是“输入”。

返回

如果用户选择,并单击“确定”按钮,该方法返回的迭代器内的选择基于0的索引。如果用户点击“取消”按钮,该方法返回-1。

void help (string format)

显示在Python的风格类似的monkeyrunner API参考 pydoc工具,使用指定的格式。 参数

format 在输出中使用标记格式。可能的值是“txt”为纯文本或“html”为HTML。 string input (string message string initialValue, string title, string okTitle, string cancelTitle)

显示一个对话框,接受输入并返回到程序。对话框是模态,使程序暂停,直到用户点击对话框的按钮之一。

该对话框包含两个按钮,其中一个显示的okTitle的价值和其他cancelTitle价值。如果的用户点击okTitle的按钮,输入框的当前值返回。如果的用户点击cancelTitle的按钮,则返回一个空字符串。

参数

message 显示在对话框的提示消息。

initialValue 初始值显示在对话框中。默认是一个空字符串。

title 对话框的标题。默认的是“输入”。

okTitle 在okTitle按钮显示的文本。默认的是“OK”。

cancelTitle 在cancelTitle按钮显示的文本。默认是“cancel”。

返回

如果用户点击okTitle按钮,则该方法返回当前值对话框的输入框中。如果的用户点击cancelTitle的按钮,该方法返回一个空字符串。

void sleep ( float seconds )

暂停当前程序中指定的秒数。

参数

seconds 暂停的秒数。

试图使之间的连接monkeyrunner后端和指定的设备或模拟器。

参数

timeout 等待连接的秒数。默认情况下是永远等待。

deviceId 一个正则表达式指定的设备或仿真器的序列号。请参阅主题 Android调试桥 的设备描述和仿真器的序列号。

返回

一个MonkeyDevice 设备或模拟器的实例。使用这个对象来控制和通信设备或模拟器。 MonkeyImage

使用 MonkeyDevice.takeSnapshot()创建一个新实例

string convertToBytes ( string format)

当前图像转换成特定的格式,并返回一个字符串 ,然后可以访问作为一个迭代的二进制字节。

参数

format 所需的输出格式。支持所有常见的栅格输出格式。默认值是“PNG(便携式网络图形)。

tuple getRawPixel (integer x, integer y)

返回单个像素在图像的位置(X,Y),作为一个元组整数的形式,(A,R,G,B)。 参数

x 像素的水平位置,在左边方向的屏幕截图时0开始。

y 像素的垂直位置,方向的屏幕截图时顶部0开始。

返回

一个元组代表像素的整数形式(A,R,G,B),其中a是alpha通道值,R,G和B是红色,绿色和蓝色值,分别为。

tuple getRawPixelInt (integer x, integer y)

单个像素,在图像的位置(X,Y)返回一个整数。使用这种方法,以节约内存。

参数

x 像素的水平位置,在左边方向的屏幕截图时0开始。

y 像素的垂直位置,方向的屏幕截图时顶部0开始。

返回

A,R,g和b值的像素为8位值组合成一个32位的整数,最左边的8位,R的最右边,等等。

创建一个新的MonkeyImage从当前图像的矩形选择的对象。

参数

RECT 一个元组(X,Y,W,H)指定选择。x和y指定0的像素位置,选择左上角的角落。w指定区域的宽度,h指定的高度,像素为单位。

图像的方向是在截图时屏幕方向相同。

返回

一个新MonkeyImage的对象,包含选择。

比较这MonkeyImage对象到另一个对象,并返回比较的结果。%的参数指定两个图像是“平等”的百分比差异。

参数

other 另一个MonkeyImage对象这一个比较。

percent 在范围内的浮动0.0到1.0,包容,表示真正的需要,是该方法返回相同的像素的百分比 。默认为1.0,表明所有的像素必须匹配。

返回

布尔如果图像匹配,或者布尔值,否则返回false。

void writeToFile (string filename, string format)

当前图像写入指定的文件名 ,在指定的格式格式。

参数

path 完全合格的文件名和输出文件的扩展。

format 使用的文件输出格式。如果没有提供的格式,则该方法试图猜测文件名的扩展名的格式。如果没有扩展,并没有指定格式,然后使用“PNG(便携式网络图形)的默认格式。

MonkeyDevice

使用newdevice = MonkeyRunner .waitForConnection()来创建一个对象 void broadcastIntent ( string uri, string action, string data, string mimetype, iterable categories dictionary extras, component component, iterable flags)

广播这个装置的目的,如果意图从应用程序。有关参数的更多信息见意向书。

参数

uri 为意向的URI。(见Intent.setData( ) ) 。

action 这一意图的行动(见Intent.setAction() )。

data 这种意图的数据URI(见Intent.setData() )。

mimetype 意图的MIME类型(见Intent.setType() )。

categories 一个可迭代的数据结构,包含字符串定义为这一意图的类别(见 Intent.addCategory() )。

extras 一个额外的数据字典的这种意图(见Intent.putExtra() 的一个例子)。

每个字典项目的关键应该是一个字符串。该项目的值可以是任何简单或结构化数据类型。 component 用于此目的的的组件(见ComponentName)。使用此参数将直接意图在一个特定的Android包到一个特定的类。

flags 一个可迭代的数据结构,包含标志,控制的意图是如何处理(见Intent.setFlags() )。 void drag ( tuple start, tuple end, float duration, integer steps)

模拟设备的屏幕上拖动动作(触摸,持有和移动)。

参数

start 拖动动作的起点,在一个形式的元组 (X,Y),其中x和y都是整数。

end 拖动动作的终点,在一个形式的元组(X,Y),其中x和y都是整数。

duration 拖动动作在几秒钟的时间。默认为1.0秒。

steps 插值点时要采取的步骤。默认为10。

object getProperty (string key)

鉴于系统环境变量的名称,返回此设备的价值。

参数

key 系统环境变量的名称。表1中列出了可用的变量名称 。属性变量的名称在本主题的结尾。

返回

变量的值。根据请求的变量的数据格式。

object getSystemProperty (string key)

同义词getProperty()方法。

参数

key 系统环境变量的名称。表1中列出了可用的变量名 物业变量名。

返回

变量的值。根据请求的变量的数据格式。

void installPackage (string path)

安装到这个设备packageFile中的Android应用程序或测试包。如果已安装的应用程序或测试包,它会被替换。

参数

path 完全合格的路径和文件名 的。apk文件安装。

dictionary instrument ( string className, dictionary args)

运行指定的组件与Android仪器,在字典中的确切格式取决于正在运行的组件,并返回结果。组件必须已经是目前此设备上。

使用此方法来启动一个测试案例,使用Android的测试用例类之一。查看学习与Android的测试框架进行单元测试的测试基础。

参数

className 一个Android组件已安装此设备上的标准格式软件包名/类名,其中packageName是一个Android包名称,名称。APK在此设备上的文件,classname是一个Android组件的类名(活动ContentProvider的服务,或BroadcastReceiver)在该文件中。软件包名和类名都必须完全符合。ComponentName看到 更多细节。

args 字典包含国旗和他们的价值观。这些都传递给组件,因为它是开始。如果标志不采取一个值,设置它的字典值一个空字符串。

返回

体裁作文