淘宝自动化测试组自行研发的一套界面自动化测试框架
软件测试中的自动化测试工具与框架

软件测试中的自动化测试工具与框架在软件测试中,自动化测试工具与框架扮演着至关重要的角色。
通过自动化测试工具与框架,测试人员可以提高测试效率、减少测试成本、加速测试周期,并确保软件质量。
下面将介绍几种常用的自动化测试工具与框架,它们在软件测试中的应用以及各自的特点。
一、SeleniumSelenium是一套开源的自动化测试工具,主要用于Web应用程序的自动化测试。
Selenium支持多种浏览器,包括Chrome、Firefox、IE等,并且可以运行在不同的操作系统上。
测试人员可以使用Selenium来录制和回放测试用例,进行断言验证,以及生成测试报告。
Selenium提供了多种编程语言的客户端库,如Java、Python、C#等,测试人员可以根据自己的熟悉程度选择合适的编程语言来编写测试脚本。
Selenium还支持分布式测试和并行测试,可以大大提高测试效率。
二、AppiumAppium是一款开源的移动应用自动化测试工具,支持iOS和Android平台上的原生应用、混合应用和移动Web应用的自动化测试。
Appium基于WebDriver协议,测试人员可以使用多种编程语言来编写测试脚本,如Java、Python、Ruby等。
Appium支持跨平台测试,测试人员可以在不同的设备上运行相同的测试用例,提高测试的覆盖范围。
Appium还支持无需修改应用代码就能进行自动化测试的功能,测试人员可以直接操作应用的用户界面来进行测试。
三、JenkinsJenkins是一款开源的持续集成和持续交付工具,可以用于自动化构建、测试和部署软件项目。
测试人员可以通过Jenkins来触发自动化测试工具执行测试用例,生成测试报告,并将测试结果反馈给开发团队。
Jenkins提供了丰富的插件和扩展功能,可以与各种自动化测试工具对接,如Selenium、Appium等。
测试人员可以在Jenkins中配置测试任务的执行时间、频率和触发条件,实现持续集成和持续测试。
自动化测试框架(转载)

自动化测试框架(转载)自动化测试框架(转载)引言:自动化测试框架是软件测试过程中的关键组成部分,它能够提高测试效率、降低测试成本,并提供可靠的测试结果。
本文将介绍自动化测试框架的定义、优势以及常见的五个部分,分别是测试脚本编写、测试数据管理、测试执行、测试结果分析和报告生成。
一、测试脚本编写:1.1 测试脚本语言选择:根据项目需求和技术栈选择合适的测试脚本语言,如Python、Java、C#等,以确保脚本编写的灵活性和可维护性。
1.2 测试脚本设计模式:采用设计模式,如Page Object模式、数据驱动模式等,提高测试脚本的可读性和可扩展性。
1.3 测试脚本框架封装:将常用的测试脚本功能进行封装,如日志记录、异常处理、浏览器驱动管理等,提高测试脚本的复用性和稳定性。
二、测试数据管理:2.1 测试数据准备:根据测试用例的需求,准备合适的测试数据,包括输入数据、预期结果等,以保证测试的全面性和准确性。
2.2 测试数据管理工具:使用测试数据管理工具,如Excel、数据库等,对测试数据进行统一管理,方便测试用例的编写和维护。
2.3 数据驱动测试:通过将测试数据和测试脚本分离,实现数据驱动测试,提高测试用例的可维护性和扩展性。
三、测试执行:3.1 自动化测试集成:将自动化测试框架与持续集成工具(如Jenkins)进行集成,实现自动触发测试、自动化部署等,提高测试的效率和稳定性。
3.2 并行执行测试:通过多线程或分布式执行测试,提高测试执行的速度,缩短测试周期。
3.3 测试执行管理:对测试执行过程进行监控和管理,包括测试进度、测试结果等,以及错误日志的收集和分析,方便问题的定位和修复。
四、测试结果分析:4.1 测试结果收集:将测试执行的结果进行收集和存储,包括测试通过率、失败用例等,以便后续的分析和报告生成。
4.2 缺陷管理:将测试中发现的缺陷进行记录和管理,包括缺陷的分类、优先级、状态等,方便开发人员进行问题修复。
淘宝测试架构白皮书

淘宝测试架构白皮书2010淘宝-技术研发部-市场产品技术-测试-系统测试-测试架构目录淘宝测试架构产生的原因 (3)测试架构 (3)测试架构流程综述 (5)测试架构师工作职能 (6)测试架构师的角色 (8)测试架构师的招聘要求 (9)编后注 (9)感谢 (10)作者 (10)版本 (10)淘宝测试架构产生的原因在软件的生产环节中,会产生许多和测试相关的问题,相应的也会出现很多的解决方法,在一个肩负102年使命的公司中做测试工作,在102年宏大的软件生命周期中,测试问题解决方法也会以爆炸性的速度增加,结果会导致解决方法的数量是惊人的,方式却又是多样的,行为时分散的。
一种声音会出现,停止解决不断出现的问题,我们需要一种系统的解决方案使测试更加专业,更加适应一个长期发展,不断创新的软件环境。
这种系统的解决方案就是测试架构产生的雏形。
测试架构提供了在技术上结构化指导测试的方法,它的出现:●为测试管理者和测试人员找到技术上的解决方案●优化测试流程●标准化测试工作,探索新的测试技术●团队中测试技术信息的对称●更好的保证各个测试团队的沟通工作●对测试技术及工具的开源提供框架和方法●找出有效,高效的测试方法●分析,指出并控制产品潜在风险测试架构在淘宝,测试架构被定义为工具箱:一个测试管理人员,PTM,测试工程师的工具箱。
它将为我们实现更为专业的测试提供技术意见。
具体体现在以下几个方面1.测试策略a)前瞻性的提出未来测试的方向b)指导测试人员怎样测试c)建议测试管理者应该进行哪些方面的测试d)帮助分析测试范围e)针对每个不同的项目,在技术上分析测试进度并跟踪控制测试进度2.测试管理者的工具箱a)提供一切管理者所需要的:●Test goal●Test Scope●Test Focus●Risk●Master test plan●Planning guidelines●Estimation guidelines●Planning tools●.......3.测试工程师的工具箱a)提供一切测试工程师所需要的:●Test documentation●Test tools and infrastructure●Test design guidelines●Test methods●…………….图1-1形象的说明了测试架构,测试架构师和团队成员的关系图1-1Test Goal:指我们的测试目标是什么,如今年的测试目标是技术上的突破,形成技术的核心竞争力。
软件测试中的自动化测试框架设计与实现

软件测试中的自动化测试框架设计与实现随着软件开发过程的复杂化和软件产品的不断更新迭代,传统的手动测试已经无法满足测试需求的快速环节。
为了提高测试效率和质量,自动化测试成为软件测试领域的重要发展方向。
而自动化测试框架作为实现自动化测试的关键组成部分,在软件测试中扮演着重要的角色。
一、自动化测试框架的概念自动化测试框架是指一套结构化的、可重用的测试工具和组件,用于支持自动化测试的设计、实施和管理。
它提供了一系列的接口和功能,可以帮助测试人员快速、高效地完成测试任务。
自动化测试框架的设计和实现,应该充分考虑测试需求的多样性和软件测试工具的可扩展性,以满足不同领域、不同软件产品的测试需要。
二、自动化测试框架的设计原则1. 可扩展性:自动化测试框架应该具有良好的可扩展性,能够适应不同的测试场景和需求。
它应该能够支持不同的测试工具和组件的集成,如测试驱动开发工具、测试管理工具、应用程序接口(API)等。
2. 可重用性:自动化测试框架应该是可重用的,能够在不同的测试项目中进行复用。
通过将常用的测试模块和组件进行抽象和封装,可以提高测试的效率和质量,并减少测试案例的编写和维护成本。
3. 易用性:自动化测试框架应该是易用的,能够帮助测试人员快速上手。
它应该提供清晰的接口和文档,以及简单的配置和管理功能,使测试人员能够方便地进行测试脚本的编写、执行和结果分析。
4. 可靠性:自动化测试框架的设计和实现应该具有高可靠性,能够在不同的测试环境中稳定运行,并能够有效地捕获和处理测试中的异常情况。
此外,它还应该具备可恢复性,能够在发生错误时恢复到上一次的正确状态。
三、自动化测试框架的实现步骤1. 确定测试目标和需求:在设计自动化测试框架之前,首先需要明确测试的目标和需求。
根据不同的测试需求,确定测试的范围和测试用例的编写方式,以及所需的测试数据和环境。
2. 选择适合的测试工具:根据测试需求,选择适合的自动化测试工具。
常见的测试工具包括Selenium、Appium、JUnit等。
淘宝Android自动化测试-技术沙龙

• Open source at
–
TMTS架构
TmtsFramework
• Finder: 返回TmtsView对象
– 静态方法
• T findTmtsViewById(String, Class<T>) • TextView findTmtsTextViewByText(String) • TmtsToast findTmtsToast()
– TmtsToast
• String getText()
TMTS示例
• 原生控件示例 • Webቤተ መጻሕፍቲ ባይዱiew示例
原生控件示例
public void testFindMixed() throws Exception { findTmtsTextViewByText("ListView").doClick(); TmtsAbsListView listView = findTmtsViewById("my_listview", TmtsAbsListView.class); TmtsViewGroup group = listView.getChildByIndex(20, TmtsViewGroup.class); TmtsTextView textView = group.getChildByIndex(1, TmtsTextView.class); assertEquals("Item20", textView.getText()); TmtsTextView textView2 = findTmtsTextViewByText("Item20"); assertEquals("Item20", textView2.getText()); group.doLongClick(); findTmtsTextViewByText("Item One").doClick(); assertEquals("1 pressed!", findTmtsToast().getText()); }
自动化测试框架

自动化测试框架自动化测试框架(Automated Testing Framework)是软件测试领域中的一种技术解决方案。
它提供了一套工具和规范,用于实现自动化测试的目标和要求。
自动化测试框架可以帮助软件测试团队提高测试效率、减少人力成本和测试周期,并提升软件质量和稳定性。
本文将介绍自动化测试框架的定义、特点、优势以及常见使用场景。
一、定义自动化测试框架是一种技术解决方案,用于实现软件测试自动化的目标和要求。
它包括了一系列的工具、库和规范,用于测试用例的编写、执行、管理和报告。
自动化测试框架可以帮助测试人员将重复、繁琐的测试任务交给计算机自动执行,提高测试效率和准确性。
二、特点1. 可重复性:自动化测试框架可以重复执行相同的测试用例,确保测试的可靠性和一致性。
2. 高效性:相比手动测试,自动化测试具有更高的执行效率和测试覆盖率。
3. 可扩展性:自动化测试框架可以方便地添加、修改和删除测试用例,适应不断变化的需求。
4. 可维护性:自动化测试框架提供了良好的结构和规范,便于测试用例的维护和更新。
5. 可自定义性:自动化测试框架允许用户根据需要进行定制,满足不同项目和环境的需求。
三、优势1. 提高测试效率:自动化测试框架可以快速执行大量的测试用例,在较短的时间内完成测试任务,提高测试效率。
2. 减少人力成本:相比手动测试,自动化测试可以节省大量的人力资源,降低测试成本。
3. 提升测试准确性:自动化测试框架可以减少人为错误,提高测试的准确性和可靠性。
4. 增强测试覆盖率:自动化测试框架可以执行更广泛的测试用例,提高测试覆盖率,发现更多的潜在问题。
5. 改善软件质量:自动化测试可以持续进行,及时发现和修复软件缺陷,提升软件的质量和稳定性。
四、常见使用场景1. 单元测试:自动化测试框架可以用于编写和执行单元测试,验证代码的正确性和可靠性。
2. 功能测试:自动化测试框架可以模拟用户操作,测试软件的各项功能是否正常。
自动化测试中常用的UI自动化测试框架介绍

自动化测试中常用的UI自动化测试框架介绍在软件开发的过程中,UI(用户界面)自动化测试是一项必不可少的工作。
自动化测试可以简化测试流程,提高测试效率,减少测试成本。
目前,在市面上有很多UI自动化测试框架,本文将介绍一些常用的UI自动化测试框架。
一、SeleniumSelenium是一个自动化测试框架,它可以模拟用户在Web页面中的操作。
它提供了很多不同编程语言的API,比如Java、C#、Python等。
Selenium可以支持各种浏览器,包括Chrome、Firefox、IE等。
它可以通过记录、回放用户的操作,在不同浏览器中自动执行测试用例。
此外,Selenium还支持一些高级功能,比如截图、断言等。
二、AppiumAppium是一个移动应用自动化测试框架。
它可以用来测试各种移动应用,包括iOS、Android、Windows等平台。
与Selenium类似,Appium也提供了各种编程语言的API,比如Java、Python 等。
它可以模拟用户在移动应用中的操作,包括点击、滑动、输入等。
Appium还提供了一些高级功能,比如录制和回放测试用例。
三、TestCompleteTestComplete是一款功能强大的自动化测试工具,它可以测试各种应用程序,包括Web应用、桌面应用、移动应用等。
TestComplete支持多种编程语言,比如JavaScript、Python等。
它还可以对各种技术框架进行测试,比如AngularJS、ReactJS等。
此外,TestComplete还提供了非常详细的测试报告。
四、Robot FrameworkRobot Framework是一款基于Python开发的自动化测试框架。
它可以测试各种应用程序,包括Web应用、桌面应用、移动应用等。
Robot Framework不仅支持Python编写的测试用例,还可以支持其他编程语言编写的测试用例。
此外,Robot Framework还提供了很多内置库,比如SeleniumLibrary、AppiumLibrary等,方便用户快速进行测试。
淘宝AndroidIOS自动化测试框架

Android自动化框架在淘宝项目过程中使用情况:(一)原来发布阶段2周,每天手工回归4h,到现在自动化执行查看结果。
效率提升,10*4h/每客户端每迭代 ,缩短开发测试周期。
(二)在规范流程方面:原来开发手工打包,旺旺发给测试发给运营,到现在平台自助打包,每日构建。
效率提升,手工打包每个2分钟,沟通成本更高。
杜绝可能出错的风险 .IOS自动化框架发展历程:(一)注入式框架:从无到有,首开先河,通过直接修改开发代码,让测试运行起来,升级日志系统,方便查看运行结果(二)instrument js 工具包:增加稳定性,增加校验功能。
增加批量执行。
效率提升,从需要注入改代码,到可以直接运行app.运行稳定性提升,增加易用性。
主要在以下方面进行了扩展:操作扩展:主要是稳定性上面的,如tap操作增加轮询元素查找。
还包括便利性的扩展,如UIAPicker的选取与展示。
校验扩展 :提供更加丰富的校验功能,及校验出错提示Log转Hudson:将UIAutomation执行后的plist结果文件,转换为hudson认识的格式。
方便持续集成里展现。
(三)InstrumentDriver :纯Java环境编写用例,更好的接入现有测试系统。
效率提升,语法出错排查时间从原来的平均30分钟,减为0.效率提升,智能感应让编写用例时间缩短30%,学习成本大幅降低。
效率提升,调试功能让出错排查时间缩短50%.在这里先简单介绍下Instrument uiautomation,Instrumentuiautomation 是苹果官方提供的iPhone手机应用的自动化测试工具。
控件元素的识别准确,属性获取,元素操作的API丰富。
可以很方便的录制测试脚本、回放和查看运行结果。
基于instrument,扩展了该框架,对其元素操作的稳定性进行了增强,统一了错误异常的处理及详细的运行日志,提供了方便的校验机制。
结合具体项目,还实现了脚本的运行调度、日志的处理以及与Hudson集成的日常回归。
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
用户手册1 AutoMan简介AutoMan是淘宝自动化测试组自行研发的一套界面自动化测试框架。
框架的核心是基于界面模型的设计,将“元素查找”和“控件操作”分开。
元素查找的方式定义在PageModel 的Web服务器上,在脚本中只说明使用控件的名称和对该控件的操作方式。
因此用该框架编写脚本具有上手快、易维护的特点。
1.2项目中的应用目前大部分的web自动化测试都是应用与回归测试,鲜少有在项目中开展web自动化的,其原因就在与选择自动化测试时,我们会考虑:1.页面设计变化频繁;2.项目周期足够长;3. 自动化测试脚本可重复使用。
而现实世界中尤其是像淘宝这类一直追求敏捷开发为主的公司,其软件项目往往不满足上面的几个点。
因此,大多数已有的web自动化框架都不能在项目中适用。
因此,基于这种现实,淘宝自动化组根据淘宝的项目实际研发的AutoMan框架就很好的解决了这个问题。
AutoMan核心思想是将“元素查找”和“控件操作”分开,即通过web化的方式对页面控件的查找进行管理,在编写脚本时选择事前定义好的控件进行操作即可,因此该策略允许在项目的不同阶段分步进行“元素查找”和“控件操作”。
下面给出一个项目自动化的测试流程图1-1,方便用户理解:图1-1 项目自动化的测试流程通过上面的流程图,我们发现在项目的冒烟测试之前,可以根据开发提供的页面DEMO 先将页面元素定义在PageModel上,实现初步的元素查找,然后将定义好的控件根据测试用例流程编写测试代码,及完成控件操作。
当开发提供真正的页面之后,再完善元素查找,之后就可以将脚本执行起来。
由此,1. 当遇到页面设计变化频繁时,我们只需要修改PageModel上定义的控件类型或者查找方式即可,通常不需要修改具体的脚本流程。
2.由于是元素查找和控件操作是分步进行,并且在开发提供正式页面之前就进行,可以将整个测试时间大大提前,不需等到开发提供测试页面再进行脚本编写。
因此很好的适应了项目周期短的问题。
3.项目中一般会进行几轮测试,如果能将冒烟阶段或者第一轮测试阶段完成的脚本在后面几轮测试甚至是后面的回归测试中执行起来,那是自动化测试的价值体现。
综上所述,AutoMan框架让项目自动化测试由不现实变成现实。
1.3企业级的应用企业级应用最大的特点是共享,将有限的资源共享给更多的用户,降低维护成本是页面自动化企业级应用的一大特点。
AutoMan框架很好的体现了共享这一点。
主要体现在两方面的共享:1.PageModel的共享,及页面元素查找的共享;2.脚本公用方法,公用流程的共享。
上文已经介绍AutoMan的核心是将元素查找和元素操作分离,即将相关的页面控件定义在web化的PageModel上。
其目的一方面是为了降低脚本的元素查找维护,另一方面是实现页面元素的共享。
举例子,淘宝的业务非常负责,流程繁多,但是无论卖家操作、买家操作还是交易管理都会先进行登陆操作。
因此登陆是很多测试用例的前置条件。
试想如果每条产品线都需要去对登陆页面进行查找操作显然是非常浪费的。
正式由于web化的PageModel解决了这一问题,我们的方法是,只要有一条产品线对该页面进行建模,并创建好登陆共用方法,其他产品线都直接调用该定义好的页面或者方法即可,一旦页面发生变化,也只要由一条产品线同学进行维护,其他同学只管使用。
类似这样的页面或者这样的共用方法都可以采用该操作,让不同产品线之间或者不同测试之间进行共享。
因此通过共享大大降低了整个脚本的维护成本,实现企业级的应用。
1.4 AutoMan的两大组件AutoMan通过将查找元素和控件操作分离的策略降低了脚本的维护成本、页面共享。
因此作为web化管理对象库控件及查找配置的PageModel是AutoMan的一个重要组件。
此外为了方便解决脚本调试,AutoMan还提供了一个轻巧、便捷的调试小工具:AutoMan console。
该工具支持用户脱离IDE,在CMD命令行下进行元素控件的查找校验与代码调试等功能,下文会有具体介绍。
只是基于AutoMan框架具有的上手简单、脚本编写快捷、调试方便才使得其框架在淘宝内部的日常回归和项目自动化测试中得到广泛推广和使用。
2从这里开始2.1Automan-server环境搭建在试用的时候,可以连接/直接体验。
标准方式下,用户使用自己搭建的环境。
环境的搭建,参见/automan 下automan-server包的readme文件。
2.2示例代码参见/automan下automan-client包的example文件夹。
3PageModelPageModel是我们AutoMan的三大组件之一,用于将页面元素结构化的抽离出来,进行统一的页面对象库管理,它的最大优势是灵活应对页面变化。
QTP也有自己的对象库,但是它的对象库是在客户端的、并且是平铺式存放管理页面上控件。
与QTP不同,PageModel 主要有三方面的优势:首先,允许用户根据使用的需要将页面控件有组织的、有结构的进行管理,方便对页面控件的组织;其次,允许用户在还不确定页面控件具体属性的时候,先在对象库创建控件结构,方便用户在项目中开发未提供具体页面时候就可以开始编写代码,提高效率;最后,采用web化的方式进行管理,实现对象库控件的共享,适合企业级的应用。
这里主要给大家介绍:用于查找和定位控件的Selector;页面PageModel的两种组织方式element和submodel;及对象控件的数组模式处理collection。
3.1Selectorselector是用于查找、定位控件的查找器。
支持JQuery语法。
表3-1罗列了目前支持的所有JQuery方法。
唯一确定了就好了,如selector = ”#_editor”找<a>查找selector = ”#logo>a”(子孙),找<span class=”login -type”使用查找 selector=”#J_LoginTabs .login -type”selector = “#register -form>p.register-btn img”一确定时,可以指0找第一个li 下的第二个a ,使用查找 selector = “.login -notice>li:eq(0)>a:eq(1)”不经常使用找ul 下的两个li 使用查找selector = “#J_LoginTabs>*”,这时ul 下所有的儿子都会返回。
当然,也可以用selector = “#J_LoginTabs>li”。
多个元素的返回,参见Collection 填写说明<INPUT name=names[] value=5>3.2Element & SubmodelElement和Submodel是pagemodel的两种组织方式,前者是控件的最小操作单位,即下面不能再有子结点;后者是一个区块,下面可以有多个子结点。
submodel下面可以有多个element和submodel。
如图3-2所示:MyCartPage这个页面下有一大的submodel my_cart_records,下面可以包含多个子submodel,每个子submodel下面会有各自的element,如shop_info 下面就有两个element,分别是:chk_choose_shop和shop_mjs_info。
显然用户可以通过这样的类似搭积木的方式,可以将一个平面page立体画起来,方便对控件的管理。
至于将怎样的一个区域定义为一个submodel用户可以根据自己需要定义。
图3-2 submodel和element示意图3.2.1ElementElement是页面控件的最小单位,在PageModel上配置的element的时候会需要我们填写元素类型,因为不同的控件类型有不同的操作方法。
例如:textfield的控件会有set方法,而button类型的控件有click方法。
另外如何判断一个页面控件是什么类型的,也是我们需要知道的,表3-3列出了新增element类型说明及具有的方法。
3.2.2Submodel与element的相对路径我们需要查找一个element时需要填写selector,而这个selector就是在一个范围内用什么方式能找到这个控件。
所以当我们直接在这个page下定义了element,那你填写的selector就是在这个页面内查找这个控件,当我们的element是定义在submodel下的,那我们的selector只要写在这个submodel下的能找到这个控件即可,这个就是相对路径查找。
举例说明:如图3-4所示,现在需要定位到控件“秋冬打底裤”图3-4 定义的submodel和element这里用两种方式查找“秋冬打底裤”方法一:在页面上直接查找该控件list,即该控件没有定义在任何一个submodel下。
则该控件list的selector为div. grow>OL>li.first a。
方法二:将list控件定义在list_area这个submodel下面。
首先定义list_area的selector 为div. grow>OL。
则list的selector为li.first a即可。
上面两个方法对比可以发现,如果一个控件是定义在一个submodel下的,那该控件的selector应该是相对submodel的一个相对路径,而不是一个完整的路径。
3.3collectioncollection即集合,在我们填写对象库表单的时候会有一个是否是集合的选项就是这对这个collection的操作。
在我们平时操作的同一个页面上经常会遇到很多结构类似的布局,例如上图3-4所示的“今日关注上升”列表和“一周关注热门”列表,几个列表的结构都一致,都是有多条记录组成。
如果按照之前QTP或者Watir方法进行控件定位的话我们需要对每个需要操作的控件进行定位。
为了减少对这类类似布局的控件的重复定义,我们pagemodel这边引入了collection(集合)这个概念,即将页面上一些相同结构的当作一个数组处理。
并且数组可以是针对一个submodel下的所有控件的集合,例如图3-4上“今日关注上升”下面的所有记录当作一个数组。
他也可以针对submodel的一个数组,例如图3-4的“今日关注上升”和“一周关注热门”当作一个数组。
下面具体介绍下element的collection 和submodel的collection。
3.3.1element的collection图3-5 element的collection上图是常见的一个列表形式的结构,从右图的结构上可以看出,上面的5条记录结构都一致,都是OL下面的li控件。