版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
MonkeyTalk工具简介前言:MonkeyTalk工具是本人觉得强大、轻量、好用的一款工具,但是目前网上没有什么中文的资料,因此产生了对它官方文档进行一下翻译工作的想法,这是第一帖,本人水平有限,哪里有错还请大虾们指正。MonkeyTalk简介:
MonkeyTalk是世界上最强大的移动应用测试工具。它实现iOS及Android上真实的、功能交互的自动化测试——包括从最简单的冒烟测试到复杂的数据驱动测试集的所有的测试。它支持原生、移动、混合型应用,在虚拟机或者真实设备上。
MonkeyTalk2.0社区版本是GorillaLogic五年来创建自动化测试工具的巅峰成就。它的下载量超过7万次,支持者世界各地的团队灵敏快速地实现他们“五星好评”的移动应用。
现在MonkeyTalk有了专业版,移动测试自动化变得更容易了。MonkeyTalk专业版本是建立在社区办的基础上,为专业的移动测试提供无缝的工作流、更高的生产力、更少的麻烦和更简单的配置。它设计的初衷就是服务于应用测试人员和开发人员,事实证明它为每个项目的自动化测试都带来了良好的收益。MonkeyTalk专业版是与CloudMonkeyMobile签约的产品,目前提供了免费的beta版本。MonkeyTalkFAQ:
1,它总体是怎么工作的?
答:MonkeyTalk是彻底的移动应用功能测试平台。它目前支持原生及混合的应用测试。此平台有三个基本的模块:MonkeyTalkIDE(集成开发环境),MonkeyTalkAgent及MonkeyTalk脚本。
MonkeyTalkIDE——一个可以录制、回放及编写测试脚本的桌面应用
MonkeyTalkAgent——一个必须插入到所测试应用中的库
MonkeyTalkScript——美观、简单易懂、方便维护的测试脚本
首先,你必须把MonkeyTalkAgent植入到所测的应用中(详情请看相关文档/monkeytalk-documentation/monkeytalk-getting-started/install-agentMonkeyTalk),然后你可以使用IDE录制和回放脚本。参考文档(/monkeytalk-documentation/monkeytalk-getting-started),你会很快地上手测试的。2,它支持真实设备吗,还是只支持虚拟设备Emulator/Simulator?
答:都支持!它支持模拟器或者真实设备,支持USB线或者通过WiFi连接的真实设备。3,我需要Jailbreak或者Root我的设备吗?
答:完全不用!只需要把MonkeyTalkAgent插入到你的应用代码中即可测试。(译者注:换句话说它需要源代码进行插码,或者未做安全/签名保护的Apk/ipa文件用专业版中的工具进行插入Agent)4,它是免费的吗?
答:是的。MonkeyTalk免费下载,免费试用。5,它是开源的吗?
答:是的。MonkeyTalk是基于GNUAfferoGeneralPublicLicensev3(AGPLv3)开源协议的。我们非常欢迎对社区反馈和建议,尤其是补丁。
AGPL是完全基于GPL的,但是有重要的一条是如果你修改使用了此开源代码,你必须把它发布出来。GPL是允许公众发布修改版本而不公布源代码,而AGPL修补了这一条漏洞,所以公众在公共服务器上能访问它的修改版本,就应该可以查看它的源代码。如你有任何疑问,请阅读AGPLv3协议及联系你的律师。6,它是跨平台的吗?我可以在Android和IOS上录制回放吗?我可以在Android上录制然后在IOS上回放吗?
答:可以。如果你Android和IOS上是逻辑上一样的应用的话,你应该可以在其中一个录制然后在另一个进行回放。因为MonkeyTalk是基于最高级别进行事件记录,逻辑上一样的应用不一定要有完全一样的UI来进行记录回放。例如,Android典型的Tabs是在页面的顶部,而IOS是在底部,但只要它们有相同的操作记录成TabBar.Select,它们在不同的OS上就会进行不同的正确回放。7,我可以不需要源码进行测试吗?
答:不可以。你必须在应用build阶段插入MonkeyTalkAgent,这是需要源码的。但是你一旦插码完毕后(无论是开发人员还是持续集成工具进行插码),你将不再需要访问源码。8,我可以测试第三方应用吗(例如Camera、Browser等等)?
答:不可以。测试应用需要访问源码安装MonkeyTalkAgent。9,我可以测试HTML5Web应用吗?
答:可以。从1.0.40开始我们就支持原生、混合及Web应用,包括HTML5应用,可以使用我们提供的MTBrowser应用进行测试。10:,我可以测试桌面应用吗?WindowsPhone7呢?黑莓呢?FlexMobile呢?
答:不可以。从1.0.40开始我们支持IOS和Android应用,Flex和桌面Web应用仍然躺在SourceCodetree中实验。我们的确有计划在未来支持更多的平台。11,我可以测试手机游戏吗?
答:这个看情况。大部分游戏是基于随机数生成器的,这让可依赖的功能测试变得非常困难。未来我们可能发布覆盖随机数生成器及集成游戏引擎的MonkeyTalk版本。如果你使用标准UI的话,你仍然可以测试你应用中的非随机模块。12,我能测试平板吗?还是只能在手机上测试?
答:都可以!MonkeyTalk支持所有的IOS和Android机器,如果你发现有机器上MonkeyTalk不工作,请让我们知道。13,测试可以全自动化吗?我可以在CI(持续集成)上跑吗?我可以在IDE之外跑吗?我可以在命令行跑吗?
答:可以。MonkeyTalk测试可以使用Ant在命令行跑(详细请看AntRunner介绍/content/ant-runner)或者使用MonkeyTalkJava命令行执行器(详细请看JavaRUnner介绍/content/java-runner)。我们使用Hudson/Jenkins作为我们的CI服务器作为我们内部测试,它运行的非常良好。大部分的全自动化都使用模拟器来运行应用测试,因为它可以方便地保证一个可重复的初始状态。14,我可以发布一个插入了MonkeyTalkAgent的应用到应用商店吗?
答:也许可以,但是极力不推荐。我们建议你生成一个MonkeyTalk-Enabled(插入了MonkeyTalkAgent的应用)只作为开发的版本。15,我可以测试内嵌的Web页面吗?(iOS上的UIWebView,Android上的WebView)
答:从MonkeyTalkBeta4版本以后就支持内嵌的Web页面测试。在Beta5,内嵌Web页面的录制仍然没有支持,但是脚本回放功能工作的很好。我们计划在未来加入对其的录制功能。译者注:后面的FAQ是对于DIE、iOSAgent、AndroidAgent、MonkeyTalk脚本的一些内容,这里就不翻译了,后面对MonkeyTalk语言介绍及用户手册上都会有详细的说明。
(二)MonkeyTalk语言参考说明注:MonkeyTalk脚本语言是简单而强大的,此说明书中详细说明了很多用法,由于内容比较多,未翻译完的地方会后续有时间补充。概论:
MonkeyTalk是由用户层面的一系列简单命令组成的多功能测试语言。它足够简单地给测试人员使用,并且几乎不需要开发功底来进行分析,同时也可以给那些需要进一步编程的人员无缝地使用JavaScript来编写。脚本可以由简单到由txt文档直接编写,或者由MonkeyTalkIDE等录制工具直接生成。
MonkeyTalk语言是与平台无关的,并且提供了标准的API,可以由任何一种编程语言来实现。MonkeyTalk1.0中包含捆绑了JavaScript语言。命令语法:
它语法设计的出发点是让非开发人员也能轻易地看懂。它可读性高,可以使用简单的txt文本编辑器甚至表格来简单明了地阅读。另外,MonkeyTalk设计成可以用扁平表格编辑器例如MonkeyTalkIDE来进行阅读和编辑。
MonkeyTalk是一行作为一个一个命令的开始和结束,每一行遵从如下语法:
组件类型MonkeyID动作各种参数...修改器...
(ComponentTypeMonkeyIdActionArgs…Modifiers…)
总体说来,组件类型、MonkeyId、动作、参数、修改器合在一起构成命令的各个部分,组件类型所包含的动作就是这条命令的名字。
下面是各部分的说明:
1,组件类型(必填):动作执行所在的组件的类型。例如按钮(Button)或文本框(TextArea)。组件类型是大小写不敏感的。组件类型可以扩展其他的组件类型,正如下面所说,还可以继承任何已定义的方法及其参数。组件类型是代表了UI组件的逻辑名字(例如叫Button而不叫UIButton),但也可以是特定平台的别名。所有的UI组件都继承自View类型的组件,所以当你指定View作为组件类型时就像使用通配符匹配所有类型的组件,例如:#点击带有"OK"标签的任何组件ViewOKTap2,MonkeyId(必填):一个用来区分同一页面上同时显示的相同组件类型的不同组件标示。MonkeyId可以使用星号(*)表示识别到的第一个匹配类型的组件。
MonkeyId也可以规定用从1开始(不是从0开始)的引索以#N的格式来表示。这种情况下,MonkeyId标志了显示页面中的第N个匹配类型的组件。组件引索的顺序是按照坐标(x,y)从上到下、从左到右的进行排序的。
3,动作(必填):就是要执行的动作。例如包括Tap,Select,和EnterText等。动作(Action)是大小写不敏感的。
4,参数(按组件类型和动作需要填写):是一个或多个由空格隔开的列表。参数默认是从整条命令的第四列(第四部分)开始的。尽管它是以String类型表现,解读的时候是由命令的需要来进行解读的。如果某个参数是必须的但是没有填写(少写了最后一个参数),它就会使用默认值。参数可以使用星号(*)来强制使用它默认值。
5,修改器(选填):以空格隔开的、以%name=value格式表示的参数列表,%前缀用来标示它是一个修改器。有三个系统定义的修改器:
%timeout-等待多少毫秒超时,超时之前重复尝试执行命令
%thinktime-尝试执行第一次命令时的等待时间(毫秒)
%retrydelay-再次多次尝试执行命令之间的间隔时间(毫秒)。(注:如果执行不成功就会继续尝试直到超时,例如页面还没刷新找不到组件)命令举例:
所有的列都是以空格隔开的。带空格的值一定要用引号引起来。表示引号本身需要在双引号内用反斜杠转义,来表示引号本身。
点击OK按钮:ButtonOKTap点击页面上的第二个按钮:Button#2Tap点击页面上的第一个按钮:Button*Tap或者Button#1Tap
点击页面上的第一个控件:**Tap传入参数带空格:TextAreaeditText1enterText“thisisatest”设置动作超时时间为5秒TextAreaeditText1enterText“thisisatest”%timeout=5000注释是以#开头#thisisacomment#anothercommentButtonOKTap换行用\n表示InputshippingEnterText“JohnSmith\n123MainSt.\nAnytown,USA12345”脚本:
把一条或者多条MonkeyTalk命令放到一个文件中并保存为.mt文件你就得到了一个MonkeyTalk脚本。
举个例子,一个登陆的.mt脚本可能看起来是这样的:#simplescripttologinasjoeInputusernameEnterTextInputpasswordEnterText“ilikecheese”ButtonLOGINTap想在脚本中调用另一个脚本,可以使用Script命令加上.mt文件名作为MonkeyId,就像这样:Scriptlogin.mtRun变量:
脚本中可以包含写法为${name}的变量,并且可以在一条命令的任何地方使用。也可以包含写法类似于${var}的内置变量。
内置变量有%{componentType},%{monkeyId},%{action}以及内置参数%{1},%{2}等等。变量只能作为命令的某一部分,包括组件类型、MonkeyId等等。
例如,一个已命名的变量可以作为参数:InputusernameEnterText${usr}或者参数和MonkeyId:Input${foo}EnterText${bar}又或者整条命令都用参数:${foo}${bar}${baz}变量可以内嵌到某些字符串里面,但是不能内嵌到另一个变量名中,例如:InputusernameEnterText${usr}@但是下面这样的命令是不合法的:InputusernameEnterText${foo${bar}}参数化脚本:
使用Vars.Define命令可以在脚本中命名变量并设置它们的默认值。让我们参数化我们的Login.mt脚本如下:Vars*Defineusr=""pwdInputusernameEnterText${usr}InputpasswordEnterText${pwd}ButtonLOGINTap我们设置了两个变量${usr}和${pwd},并设置${usr}的默认值为。${pwd}变量的默认值没有指定,所以默认值会是<pwd>(以尖括号括起来的变量名)。
我们可以用如下方式调用我们的参数化脚本:Scriptlogin.mtRun"ilikecheese"或者让脚本参数使用默认值:Scriptlogin.mtRun或者使用一个星号来使用${usr}的默认值:Scriptlogin.mtRun*password1请注意变量只能在定义它们的脚本中使用,所以${usr}和${pwd}只在login.mt中有定义。当然除非你使用变量来调用一个子脚本。数据驱动脚本:
参数化脚本只是一个开始,MonkeyTalk支持全数据驱动的脚本,仅仅只要使用RunWith代替Run命令,并且设定一个数据文件作为第一个参数。
用我们的参数化脚本login.mt举例,我们首先编写一个数据文件credentials.csv,用csv格式保存如下:,"ilikecheese",,abc123第一行可以指定变量名(与login.mt脚本最前面的Vars.Define中他们命名完全相同),后面各行指定变量值。MonkeyTalk需要CSV文件每一列以逗号隔开,如果带空格需要用双引号引起来。
现在,我们可以数据驱动我们的脚本:Scriptlogin.mtRunWithcredentials.csv这会根据数据文件中的每一行数据跑一边login.mt脚本。所以这个例子中login.mt会运行3此,第一次运行时参数usr=和pwd="ilikecheese",第二次usr=和pwd=password1,第三次usr=和pwd=abc123。RunIf命令:
使用RunIf命令,我们可以指定一个命令通过以后才跑某一个脚本。使用这条命令的方法是在一个带有Verify的命令执行通过以后跑指定一个脚本,使用命令如下:ScriptYourScript.mtRunIf[VerifyCommand]这意思是你在参数部分把脚本中的其他命令整个放在了里面。一个脚本例子如下:InputusernameenterTextFredInputpasswordenterTextSecurePasswordButtonLOGINtapscriptlogout.mtRunIfLabel*Verify"Welcome,Fred!"自定义命令:
MonkeyTalk语言可以通过自定义部件类型(componenttype)和动作(Action)来进行拓展。任何以两个部分组成,格式为<componentType>.<action>.mt命名的脚本自动可以作为自定义命令。例如,如果我们创建了一个名为user.login.mt的脚本,我们就可以增加一个user的部件类型,它拥有login的动作。
我们用以下的样式来调用新的自定义命令:User*Login并且我们可以传递MonkeyId以及参数:UserjoeLoginjoespassword在你自定义的命令中,可以使用%{monkeyId}的格式来使用传进来的monkeyId。下面是一个可以实现上面命令的user.login.mt脚本的例子:Vars*Definepwd="password"InputusernameenterText%{monkeyId}InputpasswordenterText${pwd}ButtonLOGINtap测试和验证:
一个测试(Test)就是使用Test部件来代替Script部件进行调用一个脚本。测试结果会写到一个标准的文件中,以JUnit-compatiblexml文件格式保存。
每条命令的执行成功与否在于验证用户指定的界面部件(元素)是否存在。另外,你也可以在脚本中使用Verify动作来验证部件中的值是否与预期一致。首先,我们再次重写login.mt,加入一些Verify动作,像这样:Vars*Defineusr=""pwd=nameInputusernameEnterText${usr}InputpasswordEnterText${pwd}ButtonLOGINTapLabelwelcomeVerify"Welcome,${name}!"ButtonLOGOUTVerify现在,我们可以以如下方式测试(Test)的方式来运行login.mt,值得注意的是,我们增加了${name}这个变量,因此我们需要加入第三个参数进行调用:Testlogin.mtRun"ilikecheese""JoeDoe"并且我们也可以使用数据驱动的方式来测试我们的脚本(注意增加第三列的数据到credentials.csv)Testlogin.mtRunWithcredentials.csv验证(Verify):
Verify动作存在于所有的部件中(除了Script和Device),用以验证实际的值是否是我们想要的值。在它的基本格式中,Verify接受三个可选参数:expectedValue,propPath,以及failMessage。
如果没有传递任何参数,Verify只验证部件是否存在:ButtonLOGINVerify当只有一个expectedValue参数时,Verify会检查部件中的值,这些值只会是部件逻辑上的值(Button的值是它的label,Input的值是它的text,CheckBox的值是"On"或者"Off",等等):ButtonLOGINVerifyLOGIN用expectedValue以及propPath作为参数时,Verify会检查制定的部件属性。一些propPaths例如value或item是逻辑上MonkeyTalk指定的属性路径,它们是跨平台的(它们不以点作为开头)。部件指定的属性值是平台相关的(它们以点作为开头)。
验证一个iOS按钮的Font名字:ButtonLOGINVerifyHelvetica.font.fontName验证Android上RatingBar总的星星数量:RatingBarreviewRatingVerify5.numStars最后一个参数时验证失败时给出的信息failMessage:InputusernameVerifyvalue"badusername!!!"可以在用户手册上查看更详细内容:
/monkeytalk-documentation/monkeytalk-user-guide/verifying-expected-values/using-verification-commands测试套件(Suite)
一个测试套件(Suite)就是若干脚本的Test放在一起执行的集合。当一个Test失败时,它不会立刻停止,而是跑下一个Test。当所有的Test执行完毕时,会生成一个xUnit-compatible的报告(http://reflex.gforge.inria.fr/xunit.html#xunitReport),报告会统计所有所跑Test的Pass数、Fail数、Error数。
Suite必须以.mts文件后缀结尾,与脚本区别开来。
Suite使用Test命令调用脚本,以"Test"作为部件类型,脚本名称作为monkeyId,Run或者Runwith作为动作(action)。一个Test命令(在Suite中使用)与Script命令(在Scripte中使用)类似;它只是增加了一些额外的管理功能。例如一个简单的Suite如下:#loginandlogoutTestlogin.mtRunjoe@JoEsPaSsWoRdTestlogout.mt只有在Suite中可以使用Test命令,相反只有脚本中可以使用Scipt命令。一般来说,如果你想要跑一个脚本,就在Suite中调用Tests,在脚本中调用Script。
有时候一组Test会共享一些依赖及清理工作,在每个Test前后进行维护时非常无聊并且容易出错的。Suite允许你使用"Setup"以及"Teardown"部件类型来进行设置初始化及清理工作(分别在每一条Test前后执行),用法与Test命令非常类似。在Suite中,任何这样定义的Setup脚本都会在没一个Test前进行调用,如果初始化成功,Test就会运行,然后Teardown就会运行(无论Test成功与否)。
Suite里面可以调用其他的Suite,使用Suite部件类型。
Suite中只能包含Test,Setup,Teardown,和Suite,以及注释。
举个例子,一个myapp.mts测试套件可能长这样:#setuprunsbeforeeverytestSetuplogin.mtRunjoe@JoEsPaSsWoRd#teardownrunsaftereverytestTearDownlogout.mtRun#thetests...Testadd_contact.mtRunWithcontacts.csvTestremove_contact.mtRunWithcontacts.csv例子中我们就使用Setup和TearDown来指定每条Test执行前后需要调用的脚本。命令执行选项:
除非特殊指定,否则MonkeyTalk在超时时间之前会不停地尝试去执行命令。超时时间的值有一个为2秒的全局默认值,也可以在每一条语句后面使用超时的编辑器(Modifier)来自定义。
例如:ButtonOKTap%timeout=5000%thinktime=2000%retrydelay=123上述命令会在尝试点击OK按钮之前等待2秒钟,然后每隔123毫秒会尝试一次执行命令,直到5秒的超时时间到。(命令最多会执行7秒钟)。注:后面的一些内容为介绍JavaScript语法、JavaAPI、命令大全的内容,太多就不翻译了。有兴趣的童鞋可以访问连接查看:
/monkeytalk-documentation/monkeytalk-language-reference/scripting-javascript到这里语法说明终于告一段落。由于最近比较懒,更新也是断断续续的,语法说明篇幅大概在4000字左右,请期待下一篇-3-(三)MonkeyTalk用户手册-IDE及Agent的安装由于用户手册的内容实在太多,会分多个章节来翻译,本章节已完成。概述:
在这里你会找到如何使用MonkeyTalk的完整的列表。如果你仍然对MonkeyTalk存在问题,请查看我们免费的社区论坛或者了解更多我们的包年支持服务,它可以让你与MonkeyTalk的创造者直接交流与获得帮助。安装MonkeyTalk:
1,首先,你必须安装MonkeyTalkIDE,请查看《安装手册》取得详细的帮助:
/monkeytalk-documentation/monkeytalk-getting-started/install-ide
2,然后,你必须在你的Android或者iOS应用(或者两者皆有的跨平台测试)上面安装MonkeyTalkAgent。根据你的平台查看不同的安装手册:
/monkeytalk-documentation/monkeytalk-getting-started/install-agent/ios
/monkeytalk-documentation/monkeytalk-getting-started/install-agent/android
3,想要自动构建启用MonkeyTalk的App请参考如何使用Ant进行构建:
/monkeytalk-documentation/monkeytalk-user-guide/installing-monkeytalk/building-ant使用Ant进行构建(buildwithAnt):
为了构建一个启用MonkeyTalk的应用程序,第一步是下载并安装AspectJ.工具。你可以从/aspectj/downloads.php
处下载最新稳定版本,解压Jar包并记住文件路径。
要使用终端为你的Android项目创建buld.xml,首先打开终端并进入到你的项目路径,然后输入:androidupdateproject--targetandroid-minSDKlevel--path.要与MonkeyTalkAgent一起build,把samples/android目录下的MonkeyTalkDemo1的custom_rules.xml拷贝到与build.xml相同的目录,然后把monkeytalk-agent.jar添加到你的Android项目库中。
最后使用Ant命令运行:antcleandebug-Dsdk.dir=/your/android-sdk-Daspectj.dir=/your/aspectj-1.2.3现在你就可以自动构建启用MonkeyTalk的应用程序了。装备你的应用:(就是在应用上插如Agent)
如何安装MonkeyTalkAgent
如果你想直接尝试MonkeyTalk,你可以尝试使用我们的Sample应用,你可以在MonkeyTalk安装压缩文件的samples文件夹中找到这些应用。这些应用都已经植入了MonkeyTalkAgent,这样你就可以直接安装打开它们,然后跳到/monkeytalk-documentation/monkeytalk-getting-started/about-ide
去了解我们的IDE功能。如果你想设置自己的应用程序,请继续下一步。
你可以在MonkeyTalk安装压缩文件的agents文件夹下找到这些Agent,它们在不同标签的子文件夹下。iOS的Agent在agents/ios文件夹,Android的在agents/android文件夹。每个平台的Agent的安装都是不一样的。
接下来的内容是不同平台的安装说明。IOS:
安装MonkeyTalkIOSAgent:
1,在你的操作系统上下载MonkeyTalk压缩文件。
2,在XCode上打开你的应用项目。
3,右键选择你的BuildTarget然后选择Duplicate命令复制你的构建目标:
重命名你复制的文件为YourAppMonkey之类的名字:
它看起来是这样的:
你也许想在Schemes窗口中重命名你的Scheme:
4,从菜单File>Addto“YourApp”...添加下载下来的MonkeyTalk库文件:
5,当弹窗出现时,导航到你解压MonkeyTalk压缩文件的地方,然后根据以下路径选择MonkeyTalkiOS库文件:
pathToMonkeyTalkFolder/agents/iOS.
6,选择Recursivelycreategroupsforanyaddedfolders选项。(提示:这取决于你是否愿意复制所有的item到新建的文件夹中)
7,在AddtoTargets的框中,取消选择原有的项目并选择你复制的项目:
8,点击Add
9,MonkeyTalk库文件应该在你的项目中可见了。依赖库以及构建设置(ConfiguringLibrariesandBuildSettings):
1,右键选择复制的YourAppMonkey构建项目,然后选择BuildPhases选项。
2,在LinkBinariesWithLibraries页面,如果你的项目中没有的话,你需要添加libstdc++.6.0.9.dyliblibsqlite3.dylibCFNetwork.framework以及QuartzCore.framework到项目中。(这些框架是MonkeyTalk需要的)
3,Xcode应该默认把libMonkeyTalk.a库添加到了references中。(备注:如果你想要buildiOS4.x,请把UIKit.framework的选项从"Reqired"改成“Optional”)
4,在BuildSettings页面,下滑到Linking部分,添加你的OtherLinkerFlags为:-all_load
5,在Xcode
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 炭黑生产工岗中转正晋升考核试卷含答案
- 膨胀烟丝设备操作工岗位行业发展考核试卷含答案
- 绝缘防爆工具制作工岗中工作改进考核试卷含答案
- 2026年数字工厂高级架构师招聘笔试试卷 招录16人题型大全
- 2026年影视数字化高级特效专家招聘笔试试卷 招录10人考试题库
- 救助站疫情应急处置指南
- 2026年山东省即墨市高三数学下册期末考试模拟卷【必刷】附答案
- 2026年广东省连州市高三数学下册期末考试模拟试卷带答案(黄金题型)
- 2026年山东省荣成市高三数学下册期末考试模拟考试卷附参考答案【满分必刷】
- 2026届阿里地区札达县四年级数学下学期期中检测模拟试题(含答案)
- 2026年济南市烟草系统事业单位人员招聘考试备考试题及答案详解
- 2025-2030中国香料烟行业市场发展运行及发展趋势与投资前景研究报告
- JJG 1189.1-2026 测量用互感器检定规程 第1部分:标准电流互感器
- 检验科消毒隔离培训考核试卷(附答案)(2026年)
- 深度解析(2026)《FZT 64122-2025面膜用非织造布成型片材》:标准引领产业升级解读赋能品质未来
- 工程竣工财务决算审计服务方案(五)售后服务承诺
- 2026届高三英语读后续写专项复习-孤独的转角有友谊相伴(导学案)
- 2026安徽省交控建设管理有限公司校园招聘5人笔试历年参考题库附带答案详解
- 听力损失成人听觉言语能力评估方法的专家共识
- 市政试验规范管理制度
- 心脏起搏器管理制度
评论
0/150
提交评论