版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
延迟符软件测试简介与Junit测试框架测试与部署什么是软件测试软件测试是软件工程过程的一个重要阶段,是在软件发布前对软件开发各阶段产品的最终检查,是为了保证软件开发产品的正确性、完全性和一致性而检测软件错误、修正软件错误的过程。软件开发的目的是开发出实现用户需求的高质量、高性能的软件产品,而软件测试是以检查软件功能和其他非功能特性为核心,是软件质量保证的关键,也是成功实现软件开发目标的重要保障。软件测试执行过程延迟符1.测试计划确定各测试阶段的目标和策略。这个过程将输出测试计划,明确要完成的测试活动,评估完成活动所需要的时间和资源,设计测试组织和岗位职权,进行活动安排和资源分配,安排跟踪和控制测试过程的活动。012.测试设计根据测试计划设计测试方案。测试设计过程输出的是各测试阶段使用的测试用例。测试设计也与软件开发活动同步进行,其结果可以作为各阶段测试计划的附件提交评审。测试设计的另一项内容是回归测试设计,即确定回归测试的用例集。对于测试用例的修订部分,也要求进行重新评审。02软件测试执行过程延迟符3.测试实施使用测试用例运行程序,将获得的运行结果与预期结果进行比较和分析,记录、跟踪和管理软件缺陷,最终得到测试报告。034.测试配置管理测试配置管理是软件配置管理的子集,作用于测试的各个阶段。其管理对象包括测试计划、测试方案(用例)、测试版本、测试工具及环境、测试结果等。一般会得到一个基线测试用例库。04软件测试执行过程延迟符5.资源管理包括对人力资源和工作场所,以及相关设施和技术支持的管理。如果建立了测试实验室,还存在其他的管理问题。6.测试管理采用适宜的方法对上述过程及结果进行监视,并在适用时进行测量,以保证上述过程的有效性。如果没有实现预定的结果,则应进行适当的调整或纠正。0506测试方法(黑盒测试)黑盒测试:
是功能测试、数据驱动测试或基于规格说明的测试。在不考虑程序内部结构和内部特性的情况下,测试者依据该程序功能上的输入输出关系,或是程序的外部特性来设计和选择测试用例,推断程序编码的正确性。测试方法(白盒测试)白盒测试:
是结构测试、逻辑驱动测试或基于程序的测试。测试者熟悉程序的内部结构,依据程序模块的内部结构来设计测试用例,检测程序代码的正确性。单元测试:单元测试的对象是程序系统中的最小单元--模块或组件上,在编码阶段进行,针对每个模块进行测试。多个模块可以平行地,独立地测试,通常要编写驱动模块和桩模块。集成测试:集成测试,也称组装测试,联合测试,子系统测试,在单元测试的基础上,将模块按照设计要求组装起来同时进行测试,主要目标是发现与接口有关的模块之间问题。两种集成测试方式:一次性集成方式和增值式集成方式。功能测试:一般须在集成测试之后进行,而且是针对应用系统进行测试。功能测试是基于产品功能说明书,是在已知产品应具有的功能,从用户角度来进行功能验证,来确认每个功能是否都能正常使用。系统测试:是将软件放在整个计算机环境下,在实际运行环境下进行一系列的测试,包括恢复测试,安全测试,强度测试和性能测试等。验收测试与安装测试:验收测试的目的是向未来的用户表明系统能够像预定要求那样工作,验证软件的功能和性能。安装测试是指按照软件产品安装手册或相应的文档,进行一步一步的安装操作性的测试。测试发生的时间顺序什么是JUnitJUnit是一个开放源代码的Java测试框架,用于编写和运行可重复的测试。它是用于单元测试框架体系xUnit的一个实例(用于Java语言)。它包括以下特性:用于测试期望结果的断言(Assertion);用于共享共同测试数据的测试工具;用于方便的组织和运行测试的测试套件;图形和文本的测试运行器。使用JUnit时,主要都是通过继承TestCase类别来撰写测试用例,使用testXXX()名称来撰写单元测试,用JUnit写测试真正所需要的就三件事:一个import语句引入所有junit.framework.*下的类;一个extends语句让你的类从TestCase继承;一个调用super(string)的构造函数;Junit提供的辅助函数01assertEquals([Stringmessage],expected,actual)比较两个基本类型或对象是否相等(expected和actual是原始类型数值(primitivevalue)或者必须为实现比较而具有equal方法);02030405060708assertFalse([Stringmessage],booleancondition)对布尔值求值,看它是否为“真”;assertTrue([Stringmessage],booleancondition)对布尔值求值,看它是否为“假”assertNull([Stringmessage],java.lang.Objectobject)检查对象是否不为“空”;assertNotNull([Stringmessage],java.lang.Objectobject)检查对象是否不为“空”;assertSame([Stringmessage],expected,actual)检查两个对象是否为同一实例;assertNotSame([Stringmessage],expected,actual)检查两个对象是否不为同一实例;fail(Stringmessage)使测试立即失败,其中message参数使可选的。这种断言通常被用于标记某个不应该到达的分支(例如,在一个预期发生的异常之后)。Junit测试实例1.在IDEA中建立一个JavaSE项目(JavaProject),名称为“chap10”,然后在其中加入一个类,包名为“com.my.book”,类名为“Helloworld”,Junit测试实例完成后加入自定义方法“ShowHello”和“isSubString”packagecom.my.book;publicclassHelloWorld{ publicStringshowHello(Stringwords){ return"Hello"+words; } publicbooleanisSubString(Stringallstr,Stringsubstr){ returnallstr.indexOf(substr)>=0?true:false; } publicstaticvoidmain(String[]args){ }}在maven中引入junit<dependencies><dependency><groupId>junit</groupId><artifactId>junit</artifactId><version>4.13.2</version><!--JUnit版本--><scope>test</scope></dependency></dependencies>Junit测试实例2.测试Helloworld类的两个方法,将鼠标放置在“Helloworld.java”文件中的“Helloworld”类名上,按住Ctrl+Shift+T快捷键,弹出junit测试选项,选择“CreateNewTest…”,Junit测试实例3.在弹出新建窗体中,选择JUnit4,其他包名、类名用默认值,选中类Helloworld的要测试的两个方法,点完成即可得到测试代码.Junit测试实例4.得到的测试类名为HellowordTest,在同一个包下产生文件HellowordTest.java,完成后在HellowordTest.java中输入测试相关代码,importorg.junit.Test;importstaticorg.junit.Assert.*;publicclassHelloWorldTest{HelloWorldhello=newHelloWorld();@TestpublicvoidtestShowHello(){assertEquals(hello.showHello("world"),"Helloworld");assertEquals(hello.showHello("world"),"Helloworld");//故意输入错的结果}@TestpublicvoidtestIsSubString(){assertEquals(hello.isSubString("world","or"),true);assertEquals(hello.isSubString("world","not"),false);}}Junit测试实例5.运行测试代码,可以同时运行全部测试,也可以单独运行某一个测试。运行全部测试时,选择“HelloWorldTest”旁边的提示,运行“RunHelloWorldTest”,如图10-4所示。运行后,得到测试结果如图10-5所示,因为有一个故意输入的错误,所以结果显示Testfailed有1个。如果给的预期结果一致,每次的测试结果都应该是OK的,这样才能说明测试是成功的。
图10-4图10-5Junit测试实例将代码中assertEquals(hello.showHello("world"),"Helloworld")改为上一行一样即可6.进行单独运行某一个测试时,找到要测试的方法。例如,要测试“testShowHello()”方法,选择方法旁边的提示,运行“RuntestShowHello”,如图10-7所示。图10-7图10-6谢谢观看任务10.1系统单元测试测试与部署主讲人:葛业波任务实施本任务是使用Junit测试框架测试用户登录模块,用户登录模块主要功能是验证用户的用户名和密码是否正确任务实施创建用户类:user.java,publicclassUser{privateStringuserName;privateStringpassword;publicStringgetUserName(){returnuserName;}publicvoidsetUserName(StringuserName){this.userName=userName;}publicStringgetPassword(){returnpassword;}publicvoidsetPassword(Stringpassword){this.password=password;}}系统单元测试创建用户登录类:LoginAction.java,publicclassLoginAction{//用户对象
privateUseruser;//获取用户对象
publicUsergetUser(){returnuser;}//设置用户对象
publicvoidsetUser(Useruser){this.user=user;}//执行登录操作
publicStringexecute()throwsException{
if(user!=null&&"admin".equals(user.getUserName())&&"123456".equals(user.getPassword())){return"success";//登录成功返回"success"}else{return"failure";//登录失败返回"failure"}}}系统单元测试创建用户登录测试类:LoginActionTest.java,publicclassLoginActionTestextendsTestCase{ protectedvoidsetUp()throwsException{ super.setUp(); } protectedvoidtearDown()throwsException{ super.tearDown(); } //测试LoginAction的execute()方法 publicvoidtestExecute(){//创建用户登录Action对象 LoginActionlogin=newLoginAction();//创建用户对象 Useruser=newUser();//设置用户名、密码测试数据 user.setUserName("admin"); user.setPassword("123456"); login.setUser(user); Stringresult=null; try{//得到Action执行结果 result=login.execute(); }catch(Exceptione){ e.printStackTrace(); }//检查Action执行的结果是否正确 assertEquals("success",result); }}系统单元测试测试代码测试用户输入的用户名和密码,如果用户输入的用户名是“admin”、密码是“123456”,测测试结果应该是通过,如果输入的用户名与密码不正确则不能通过,测试运行结果如图所示。
使用Junit工具测试学工管理系统的系统管理模块拓展训练系统单元测试谢谢观看性能测试测试与部署主讲人:葛业波什么是性能测试
性能测试是通过自动化的测试工具模拟多种正常、峰值以及异常负载条件来对系统的各项性能指标进行测试。负载测试和压力测试都属于性能测试,两者可以结合进行。通过负载测试,确定在各种工作负载下系统的性能,目标是测试当负载逐渐增加时,系统各项性能指标的变化情况。压力测试是通过确定一个系统的瓶颈或者不能接收的性能点,来获得系统能提供的最大服务级别的测试。软件性能测试术语响应时间是对请求作出响应所需要的时间;并发用户数是业务并发用户数,在同一个时间段内访问系统的用户数量;吞吐量是指“单位时间内系统处理的客户请求的数量”,直接体现软件系统的性能承载能力;性能计数器是描述服务器或操作系统性能的一些数据指标;资源利用率是系统各种资源的使用状况;思考时间也被称为“休眠时间”,从业务的角度来说,这个时间指的是用户在进行操作时,每个请求之间的间隔时间。ApacheJMeter是Apache组织开发的基于Java的压力测试工具。用于对软件做压力测试,它最初被设计用于Web应用测试但后来扩展到其他测试领域。它可以用于测试静态和动态资源例如静态文件、Java小服务程序、CGI脚本、Java对象、数据库,FTP服务器,等等。JMeter可以用于对服务器、网络或对象模拟巨大的负载,来在不同压力类别下测试它们的强度和分析整体性能。另外,JMeter能够对应用程序做功能/回归测试,通过创建带有断言的脚本来验证你的程序返回了你期望的结果。为了最大限度的灵活性,JMeter允许使用正则表达式创建断言。JMeter系统测试是什么1.安装并启动JMeter到/download_jmeter.cgi网站下载最新的JMeter的release版本,下载的.zip文件解压到d:/JMeter目录下。使用“%JMeter%/bin”下面的jmeter.bat批处理文件启动JMeter的可视化界面,JMeter测试流程2.建立测试计划
测试计划描述了执行测试过程中JMeter的执行过程与步骤,一个完整的测试计划包括一个或者多个线程组、逻辑控制、实例产生控制器、侦听器、定时器、比较、配置元素等。打开JMeter时,它已经建立一个默认的测试计划,一个JMeter应用的实例只能建立或者打开一个测试计划。现在填充一个测试计划内容,这个测试计划向一个JSP文件发出请求。JmMeter测试流程3.增加负载信息设置在测试计划中增加相关负载设置,我们模拟10个请求者,每一个请求者在测试过程中连续请求2次,具体步骤:选中可视化界面中左边树的测试计划节点,单击右键,选择“添加->Threads(User)->线程组”,界面右边将会出现设置信息框;线程组有3个和负载信息相关的参数。线程数:设置发送请求的用户数目;Ramp-UpPeriod:每一个请求发生的时间间隔;循环次数:请求发生的重复次数。
根据项目的设计,我们将“线程数”设置为10,Ramp-UpPeriod设置为0,循环次数设置为2,JMeter测试流程4.增加默认http属性(可选)选择左边树的“测试计划”节点,单击右键,选择“增加->配置元件->Http请求默认值”,界面右边将会出现设置信息框。默认的http属性的主要参数说明如下:Protocol:发送测试请求时使用的协议;ServerNameorIP:被测试服务的IP地址或者名字;Path:默认的起始位置;PortNumber:服务器提供的端口号。测试计划将针对本机Web服务器上的Web应用进行测试,所以Protocol设置为http;IP使用localhost;因为Web应用发布的Context路径是“/chap3”,所以这里设置的Path设置为“/chap3”;因为使用Tomcat服务器,所以PortNumber是8080。JMeter测试流程5.增加http请求需要增加http请求,这是测试的主体部分,主要步骤:选中可视化界面左边数的“线程组”节点,单击右键,选择“增加->Sampler->HttpRequest”,界面右边将会出现设置信息框。这里的参数和上面的http属性差不多,增加的属性中有发送http的方法的选择,我们可以选择get或者post。现在增加一个http请求,它用来访问http://localhost:8080/chap3/addRecord.jsp,因为我们设置了默认的http属性,所以和默认的http属性中相同的属性不再重复设置,JMeter测试流程6.增加监听器增加监听器是为了记录测试信息并可以使用JMeter提供的可视化界面查看测试结果,主要步骤:选中左边树的“测试计划”节点,单击右键,选择“增加->监听器->用表格查看结果”,界面右边将会出现设置信息和结果显示框。结果显示界面将使用表格显示测试结果,表格的第一列Sample#显示请求执行的顺序和编号,URL列显示请求发送的目标,SampleTime列显示这个请求完成耗费的时间,最后的Success列显示该请求是否成功执行。在界面的最下面还可以看到一些统计信息,如平均时间等。JMeter测试流程7.开始执行测试计划点击菜单“运行->启动”开始执行测试计划,谢谢观看任务10.2系统测试与性能测试测试与部署主讲人:葛业波用户登录测试分析用户登录模块要求对输入的用户名和密码进行测试,要求对所有可能的输入的可能测试,确保系统的健壮性。用户登录主要测试点:用户名与密码是否为空;用户名输入的类型与长度;密码输入的类型与长度;输入系统存在的用户名和密码;输入非法的用户名和密码。用户登录模块输入校验设计<!DOCTYPEhtml><htmllang="en"><head><title>Document</title></head><body><form>
账号<inputtype="text"name="username"id="username"style="height:28px;"><br>
密码<inputtype="password"name="password"id="password"style="height:28px;"><br><inputclass="submit"type="submit"value="提交"style="font-size:20px;"></form><script>functionconfirmName(){//在前端form表单text输入框中id名usernamevarname=document.getElementById("username");name.onblur=function(){if((name.value).length!=0){reg=/^[a-zA-Z]{4,8}$/;//账号只能是4-8位if(!reg.test(name.value)){alert("输入的用户名只能是英文字母,并且只能是4-8位");}}else{alert("输入账号不能为空");}};}
用户登录模块为了防止非法的用户输入和无效的输入设计了用户登录的输入校验,用户登录代码:login.htm,
用户登录模块输入校验设计functionconfirmPassword(){alert("aaa");varpassword=document.getElementById("password");password.onblur=function(){if((password.value).length!=0){//密码限制位6数字reg=/^[0-9]{6,6}$/g;//密码只能是6位的数字if(!reg.test(password.value)){alert("您输入的密码智能是数字,并且只能是6位!");}}};}window.onload=function(){confirmName();confirmPassword();};</script></body></html>登录页面中针对用户名、密码字段进行了输入的类型、长度、是否为空等进行了校验。
用户登录模块测试用例设计用户登录的功能是对用户的身份进行验证,进行测试的目的是允许合法用户的正常登录,阻止非法用户登录。用户的登录页面主要有用户名和密码输入框、登录按钮,登录按钮判断输入的合法性,合法的测试数据,用户名为“admin”,密码为“123456”,
操作说明输入预期结果实际结果1用户名与密码都为空,按“登录”按钮用户名:空密码:空显示警告“请输入用户名和请输入密码”请输入用户名和密码2用户名输入的是非字符,密码输入“123456”,按“登录”按钮用户名:1233密码:123456显示警告“您输入的用户名只能是英文字母”您输入的用户名只能是英文字母3用户名输入的长度超过8个,密码输入“123456”,按登录按钮用户名:abcdefghi密码:123456显示警告“用户名长度必须在4-8位之间”用户名长度必须在4-8位之间4用户名输入的长度小于4,密码输入“123456”,按登录按钮用户名:abc密码:123456显示警告“用户名长度必须在4-8位之间”用户名长度必须在4-8位之间5用户名输入的长度在4与8之间,密码输入“123456”,按登录按钮用户名:abcd密码:123456输入校验正确,用户不存在返回登录页面输入校验正确,用户不存在返回登录页面6用户名输入“admin”,密码输入非数字的字符,按登录按钮用户名:admin密码:admin显示警告“您输入的密码只能是数字,并且只能是6位”您输入的密码只能是数字,并且只能是6位7用户名输入“admin”,密码输入超过6位数字,按登录按钮
用户名:admin密码:1234567显示警告“您输入的密码只能是数字,并且只能是6位”您输入的密码只能是数字,并且只能是6位8输入用户名、密码符合要求,但不存在用户用户名:abcd密码:111111返回登录页面返回登录页面9输入用户名、密码符合要求,并且存在该用户用户名:admin密码:123456返回主页面返回主页面用户登录模块测试用例设计测试结果
使用JMeter工具测试学工管理系统的性能,使用黑盒与白盒方法测试学工管理系统的系统管理模块,要求设计测试用例并且验证测试用例。拓展训练谢谢观看主讲人:葛业波延迟符Tomcat与Docker中部署测试与部署系统部署010203
基本
步骤配置按照应用组合者的组装指令并获取所有应用程序组件提供者所声明的外部资源;分配应用程序档案和部署配置信息通过部署API安装到服务器上;开始执行请求服务器开始运行应用程序。(1)将项目放在webapps下,Tomcat服务器启动时自动部署项目。(2)更改$CATALINA_HOME\conf\server.xml文件,在<host>标签内添加<Context>标签,内容如下:<ContextdocBase="D:\javaspace\chapTest\WebRoot"reloadable="false"path="/chapTest"/>不需要将文件放置webapp下,其中reloadable="false"表示当应用程序中的内容发生更改之后服务器不会自动加载,这个属性在开发阶段通常都设为true,方便开发,在发布阶段应该设置为false,提高应用程序的访问速度。docBase为路径,可以使用绝对路径,也可以使用相对路径,相对路径相对于webapps。path属性的值是访问时的根地址,访问地址如下:http://localhost:8080/chapTest/。Tomcat中部署javaweb项目(3)这种方式和第二种方式差不多,但是不是在Server.xml文件中添加Context标签,而是在$CATALINA_HOME\conf\Catalina\localhost中添加一个xml文件,如chapTest.xml,内容如下:<ContextdocBase="D:\javaspacechapTest\WebRoot"reloadable="false"/>这种方式与第二种方式差不多,但是缺少了path属性,这种方式服务器会使用.xml的名字作为path属性的值,访问地址如下:http://localhost:8080/chapTest。
上面部署是将
chapTest文件夹部署在了服务器中,也可以将Web应用程序的内容打成*.war包,然后在部署在服务器上。Tomcat中部署javaweb项目
jar包生成的两种方式:使用IDEA工具生成,
菜单栏“File->ProjectStructure”,在“Projectsetting”中找到“Artifacts”,新建一个war包导出。使用jar命令生成,在dos命令下进入项目文件下,键入如下命令:jarcvfchapTest.war*/.,将项目中的所有代码打包成chapTest.war。重新启动服务器就可以将
chapTest.war部署为一个Web应用程序了,服务器将
chapTest.war文件解开,并且在webapps下面又生成了一个chapTest文件夹,然后把
chapTest.war的内容拷贝到里面去了。
可以通过以下方式取消自动解包,配置方式如下:
<Hostname="localhost"appBase="webapps"unpackWARs="true"autoDeploy="true"><!--将其中的unpackWARs=”true”
改成false就ok了
–><Context…./>
</Host>Tomcat中部署javaweb项目Docker是一个开源的平台,用于开发、部署和运行应用程序的容器化技术。它可以让开发者将应用程序及其所有依赖项打包到一个称为容器的轻量级、可移植的虚拟化容器中。Docker的核心组件包括DockerEngine、DockerHub、DockerCompose和DockerSwarm等。主要部署操作如下:(1)根据操作系统,安装Docker容器,进行相关配置;(2)从DockerHub上拉取官方的TomcatDocker镜像;(3)在Docker上运行默认的Tomcat容器;(4)创建一个Dockerfile来定义您的Docker镜像。在该Dockerfile中,需要指定基础镜像、将WAR文件复制到容器中的位置以及任何其他配置;(5)在包含Dockerfile的目录中,构建Docker镜像;(6)运行Docker镜像。Docker部署war包项目谢谢观看主讲人:葛业波任务10.3系统部署测试与部署(1)jar命令打包Tomcat部署(2)使用IDEA工具打包选择“WebApplication:Archive->For‘chepTest:warexploded’”后,,填写“Name”和文件输出路径“Outputdirectory”。设置后,开始创建war包,找到菜单栏“Bulid–>BulidArtifacts”,进行war包编译Docker部署Docker部署基于Ubuntu操作系统进行,首先通过Linux命令行安装Docker环境首先,更新现有的软件包列表:sudoaptupdate接下来,安装一些必备包,让apt通过HTTPS使用包:sudoaptinstallapt-transport-httpsca-certificatescurlsoftware-properties-common然后将官方Docker存储库的GPG密钥添加到系统中:curl-fsSL/linux/ubuntu/gpg|sudogpg--dearmor-o/usr/share/keyrings/docker-archive-keyring.gpg将Docker存储库添加到APT源:sudosh-c'echo"deb[arch=amd64signed-by=/usr/share/keyrings/docker-archive-keyring.
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 假期不进行有偿补课承诺书
- 计算机应用基础电子教案 单元11 信息素养与社会责任
- 2026年景德镇市珠山区工会人员招聘考试备考试题及答案详解
- 2026年芜湖市马塘区政务服务中心(窗口人员)招聘考试备考题库及答案详解
- 2026年阜阳市颍东区政务服务中心(窗口人员)招聘笔试参考题库及答案详解
- 2026年防城港市港口区政务服务中心(窗口人员)招聘考试备考试题及答案详解
- 2026年佳木斯市郊区政务服务中心(窗口人员)招聘考试参考题库及答案详解
- 2026年8月山东方舟人力资源开发有限责任公司招聘综合专员1人考试模拟试题及答案详解
- 2026广西龙州津贤人力资源有限公司招聘劳务派遣编外人员考试参考题库及答案详解
- 2026年青岛市四方区政务服务中心(窗口人员)招聘笔试备考试题及答案详解
- 2026年公共卫生执业医师考试(实践技能)综合能力测试题及答案
- 华为CAE试题及答案
- 2026年完整军队文职考试真题解析试卷及答案
- 2026年留疆战士选拔章节练习题及深度解析
- 2026年球星卡行业分析报告及未来发展趋势报告
- 白念珠菌:从形态特征、胞壁多糖结构到免疫学活性的深度剖析
- 2026年临床检验标本采集指南
- 瓦斯隧道安全管理
- 抗滑桩施工风险评估与防控措施
- 幕墙工程监测监控方法
- 母婴保健技术服务考核标准与操作规范手册
评论
0/150
提交评论