自动化测试

软件测试

基础

  • 软件测试的定义:利用一定的手段或方法,对软件的源代码、配置数据以及文档进行检测,发现实际结果与预期结果是否一致

  • 测试工程师分类

    • 测试开发工程师:负责自动化测试整体框架的维护,做必要的扩展开发。

    • 自动化测试工程师:负责底层函数封装,供自动化测试用例组装时直接调用。

    • 普通测试工程师:组装、调试、执行、维护自动化测试用例。

自动化测试

  • 定义:自动化测试通俗地讲就是使用软件A自动执行测试用例来测试软件B。软件A既可以是现有的自动化测试工具,也可以是自己编写的测试脚本。软件B就是待测试软件。

  • 自动化测试的过程

1.指定测试计划:
明确测试对象,测试目的,测试的内容,确定测试的方法和工具,编写自动化测试用例和脚本,测试执行的进度和安排,缺陷的回归验证策略,测试的报告

2.测试需求分析
根据测试计划和需求说明书,分析测试需求,整理需要执行自动化测试的需求点

3.设计测试用例
根据测试需求分析的文档,形成专门的测试用例文档

4.搭建自动化测试环境
根据选用的工具搭建集成的自动化测试环境。

5.编写自动化测试脚本
根据测试用例编写自动化测试脚本,并在搭建好的测试环境上调试通过。注意脚本的编写和命名呀符合管理规范,并通过合适的方式进行统一的管理和维护。

6.执行测试用例
准备好测试数据,按照测试计划的安排对测试用例进行执行,记录好如下信息:
测试用例的执行率
测试用例的通过率
发现的缺陷情况

7.分析测试结果,记录测试问题
对收集到数据进行分析,及时修复脚本问题,对测试工具本身的问题进行收集和记录。

8.跟踪测试缺陷
对发现的bug要记录到缺陷管理工具中去,并进行回归验证。

软件测试类型

1、功能性测试:检测软件系统业务需求是否实现。

​ 关注点:a、是否有不正确、遗漏、冗余的功能。

​ b、是否满足用户需求和系统设计的隐性需求。

​ c、对于输入是否有正常的响应,输出结果是否正确。

2、性能测试:在真实的运行环境下,模拟系统运行的业务压力和使用场景,验证系统是否满足预先定义的性能要求(是否具备宣称的能力)。

​ 关注点:性能指标:并发数、响应时间、吞吐量、TPS、HPS、硬件资源耗用等。

3、负载测试:在标准性能负荷下,不断对系统施加压力负载,直到性能临界点(不能正常处理业务)。

4、压力测试:在性能饱和状态下,持续运行系统一段时间,观察系统是否能够正常稳定的处理业务。

5、容量测试:测试软件系统的最大数据容量,主要面向数据。

6、安全测试:检查软件系统的安全保护机制是否能够承受实际应用中的非法攻击,确保软件系统数据的完整性和保密性。

7、兼容性测试:检查软件系统在不同的硬件、其他软件之间能否兼容。

​ web端:不同的操作系统、不同的浏览器、同一个浏览器的不同版本、显示器的分辨率。

​ APP端:不同的操作系统(安卓和苹果IOS)、不同的系统版本、不同的手机分辨率、不同的手机厂家。

8、可靠性测试:检测软件在规定时间、规定环境下,实现规定功能或者性能的能力

​ 指标:平均故障间隔时间(MTBF)、平均故障修复时间(MTTR)。

9、可用性测试:检测软件系统被用户使用、理解、学习,吸引用户的能力。

10、移植性测试:检测软件系统能否顺利的移植到其他的硬件或者软件平台上,且移植后能够正常、正确的满足用户的需求。

11、维护测试:在软件系统部署运行以后,对需要改正的缺陷或者系统变更升级而做的测试活动。

12、回归测试:被测对象缺陷修复后,进行的重复测试。

​ 完全回归:将整个系统的测试用例重新全部执行一次。

​ 选择性回归:

​ a、基于风险回归:除了回归缺陷是否修复完成以外,还要执行风险较高的测试用例。

​ b、基于操作剖面回归(重点业务):除了回归缺陷是否修复完成以外,还要执行用户使用率较高的功能或者业务的测试用例。

​ c、基于缺陷回归:仅仅回归测试发现缺陷的测试用例。

软件研发项目流程

产品市场需求调研 --> 可行性研究(需求评审) --> 项目立项 --> 系分 --> 测分 --> 联调 --> Siit --> 预发产品验收 --> 发布运行维护。

具体流程:

​ 调研立项:产品市场调研组织需求评审,评审通过后立项;

​ 系分:开发负责人编写系分文档组织系分评审,测试负责人编写测试计划(分配测试任务)。开发/测试人员熟悉需求各自任务。

​ 测分:开发完成产品开发,测试编写测试方案编/测试用例,测试负责人组织测分评审。

​ 联调:前后端开发联调,完成集成测试,编写交付报告,测试负责人review交付报告达标后进入SIT。

​ SIT:测试完成集成测试,跟踪管理缺陷,研发修复缺陷。测试完成复测。测试负责人编写测试报告,整理测试文档。

​ 预发产品验收:产品/业务对系统的核心功能和主要的业务流程进行验收测试。
​ 发布运行维护

项目阶段任务通过标志
需求评审prd文档prd评审
系分系分设计:接口设计、交互设计、数据结构设计、流程设计、迭代影响点等系分评审
测分测分设计:流程评估、接口交互逻辑分析、数据库设计合理性评估、功能逻辑分析、兼容性分析等等测分评审
编码开发编码+自测:根据系分内容进行编码,且对部功能进行自测(单元测试)、测试用例编写:根据测分文档进行用例编写(用例覆盖全面、用例描述清晰、测试数据准备充分)研发:
1、自测完成
2、交付用例执行完成
3、编码完成(a.codereview报告b.安全扫描c.白盒扫描d.pmd扫描)
测试:
1、交付用例准备完成30%
2、迭代功能用例100%
3、回归集成用例100%
交付测试交付测试:对研发提出的代码进行冒烟测试,主要针对流程、主功能是否正常。1、交付测试30用例执行率95%以上,没有影响功能的缺陷
2、交付测试规则,开发提供review文档(交付报告),及问题都解决;安全扫描,pmd扫描,没有1、2级问题,集成测试通过率100%。
功能测试根据迭代功能测试用例执行测试1、功能测试100%
2、遗留问题跟业务方确认ok
3、发布计划评审通过
4、质量评估报过
5、变更汇总:maven变更、jar包变更、权限变更、anx配置变更、数据库变更、sql变更&&脚本变更&&数据订正等
sit测试根据回归测试用例进行集成测试1、代码合并后,提交代码必须要对应bug,且需要代码review
2、sit缺陷需要按一定模版进行分析。有单据及时提交
预发验收根据测试同学通过个例业务方在预发环境验证预发验证
发布

自动化测试的定义和分类

1)单元自动化测试

测试范围:对最小可测单元通常为一个方法或函数进行测试。

常用工具(框架):JUnit、TestNG、Jtest、unittest和Pytest等。

(2)集成自动化测试

测试范围:软件的模块组合起来测试。主要表现之一为接口自动化测试。

常用工具(框架):JMeter、HttpClient、requests、SoapUI和Postman等。

(3)系统自动化测试

测试范围:将软件、硬件、操作人员当成一个整体进行测试。

系统测试有分:功能自动化测试、性能自动化测试、安全(渗透)自动化测试和兼容性自动化测试等。

  • 功能自动化测试
    • 定义:检查软件能否达到预期功能的测试。
    • 范围:主要表现为Web应用、移动应用和桌面应用等软件的界面测试;
    • 常用工具(框架):Selenium、Appium、Robot Framework、UFT/QTP和AutoIt等。
  • 性能自动化测试
    • 定义:模拟各种正常、峰值和异常负载条件,对系统的各项性能指标进行测试。
    • 工具:JMeter和LoadRunner。
  • 安全(渗透)自动化测试
    • 定义:检查软件是否有安全漏洞;
    • 范围:前期交互、信息收集、威胁建模、漏洞分析、渗透攻击、后渗透攻击和测试报告7个阶段;
    • 常用工具(框架):Metasploit、Burp Suite、Nessus、NMap、sqlmap、Synopsys Defensics和Peach Fuzzer等;

(4)静态自动化测试

定义:不实际运行软件的测试

范围:代码审查、文档测试。

常用工具(框架):java的有FindBugs、PMD;

文档质量

用例设计方法

  • 场景设计法

    • 基本流:正确直接完成业务
    • 备选流:最终能完成业务
    • 异常流:导致业务没完成
  • 等价类

    • 有效等价类
    • 无效等价类
  • 边界值

    • 可用集合边界
  • 判定表

  • 因果图

  • 正交实验

用例设计步骤

  1. 流程分析,使用场景设计法梳理场景,再通过等价类边界值判定表等方法细分用例;

用例格式

1、用例编号

2、测试项:测试用例所对应的测试模块;

3、用例标题

4、用例属性:描述用例的测试类型;

5、重要级别:

​ 低:UI、易用性、文字;

​ 中:主要流程结果备选流处理或者结果异常处理能够正确实现;

​ 高:实现肢体功能的用例;

6、预置条件:用例执行的先决条件;

7、测试输入:用例执行时,需要输入的数据、文件等;

8、操作步骤

9、预期结果:功能、界面;

10、实际结果

缺陷类型

缺陷类型:前端展示、前端逻辑、后端逻辑、功能遗漏、性能缺陷、安全缺陷、配置错误。

缺陷原因:需求不明确/理解,系统架构设计,后前端编码,外界环境,历史遗留。

缺陷描述模版

[缺陷ID]:
[缺陷概述]:
[原因定位]:
[重现步骤]:
[预期结果]:
[实际结果]:

[下一步处理人]:
[缺陷状态]:新建(New)、打开(Open)、修复(Fix)、关闭(Close)、重新打开(Reopen)、拒绝(Reject)
[缺陷严重度]:
[优先级]:

[发现人]:
[发现时间]:
[修复时间]:

缺陷严重度
a、低级(Low):易用性方面的错误。
b、中级(Medium):错别字、错别字体、显示错误、子功能实现错误。
c、高级(High):功能性错误,包括子功能错误,当前功能错误以及由于当前功能错误导致其他子功能无法实现的错误等等。
d、致命(Urgent):由于当前错误引起了大面积的功能错误,业务中断、流程错误、系统崩溃,以及一切涉及到金钱类的错误。

缺陷统计

缺陷类别线上缺陷数测试发现缺陷数缺陷总数缺陷遗漏率
前端展示
前端逻辑
后端逻辑
性能缺陷
安全缺陷
总计

软件质量

各阶段质量目标

1、需求调研阶段
测试对象:原始需求、规格需求、开发需求。
目的:检查需求的正确性、歧义性、完整性、一致性、可验证、可跟踪等。

2、产品设计阶段
检测对象:概要设计说明书、详细设计说明书。
目的:检测设计文档上的设计、逻辑上的错误。

3、编码开发阶段:
a、单元测试:代码的逻辑控制,数据结构等。
b、集成测试:模块间的接口数据传递关系,以及模块整合后的整体功能。
c、系统测试:系统所表现出的功能、性能等是否与用户需求一致。

4、验收测试阶段:
测试对象:系统的核心功能和主要的业务流程进行测试。
​ alpha测试:用户在模拟真实环境进行测试。(预发)
​ beta测试:用户在实际的使用环境下进行的测试。(灰度)

各阶段质量度量标准

1.需求覆盖率
需求覆盖率=测试覆盖的需求数/需求总数×100%
2.代码覆盖率
3.缺陷遗漏率
缺陷遗漏率=线上缺陷数/缺陷总数×100%

上测试环境标准

测试需检查交付报告/测试报告,变更行覆盖率95%以上,未覆盖说明原因,用例执行通过率100%,MR已全部合并。

风险评估

1、核心风险
2、如何规避风险:梳理完整测试场景、进行测试覆盖;沉淀自动化测试用例
3、如何第一时间感知风险发生:部署核对,部署异常日志监控
4、应急:降级、回滚

12种类型的测试

兼容性测试

  • 检查软件系统在不同的硬件、其他软件之间能否兼容。

    • web端:不同的操作系统、不同的浏览器、同一个浏览器的不同版本、显示器的分辨率。
    • APP端:不同的操作系统(安卓和苹果IOS)、不同的系统版本、不同的手机分辨率、不同的手机厂家。
  • 选取覆盖范围

    • 不同厂家的ROM

    • 操作系统版本(Mac、Windows、IOS、Android)

    • 屏幕分辨率

      • 电脑Mac:2560 x 1600、1680 x 1050、1440 x 900、1024 x 640;
      • 其它:1920x1080、1680x1050、1440x900、1280x960;
    • 浏览器类型

  • 浏览器开发者工具可以做兼容性测试,包括:web和app兼容、显示器分辨率;

  • 报告指标:通过率、不兼容分布(安装失败、启动失败、运行异常、功能异常、UI异常、待优化)

性能测试

  • 定义:模拟各种正常、峰值和异常负载条件,对系统的各项性能指标进行测试。

  • 性能指标:并发数、响应时间、吞吐量、TPS、HPS、硬件资源耗用等。

  • 工具:JMeter和LoadRunner。

JMeter

Web 功能

selenium

  • Selenium IDE:浏览器扩展插件,录制回放测试。
  • selenium WebDive:驱动,提供API。
  • selenium grid:分布式测试工具。

学习方法:

ChromeDrover javadoc文档

chromeDriver 谷歌官方文档

环境:selenium 架包

Selenium-Java

// ChromeOptions类,设置浏览器特定功能的边界方法。将ChromeOptions对象传递给ChromeDrriver构造函数


// 元定位


// 等待
Thread.sleep(10);						// 线程休眠,强制等待,单位毫秒
chromeDrive.manage().implicitlyWait();	// 隐式等待,设定时间内不断查找元素,真到找到/超时。在Driver整个生命周期有效。
// 显示等待,等待某个条件发生后,全局。


Selenium-python

from selenium import webdriver  # 导入模块
from time import sleep
# from selenium.webdriver.common.keys import Keys
# from selenium.webdriver import ActionChains
# from selenium.webdriver.support.select import Select
# import os
# os.getcwd()		获取当前文件目录路径

# 实例化浏览器对象
driver = webdriver.Chrome()
# 访问网站
driver.get('地址')

# 1.等待
sleep(1)                    # 显性等待
driver.implicitly_wait(10)  # 隐形等待


# 2.使用Webdriver api定位元素
driver.find_element_by_id("id")             # 元素id定位
driver.find_element_by_name("name")         # 元素name定位
driver.find.element_by_xpath('/html/')		# 绝对路径

driver.find_element_by_xpath('//input[2]')	                    # 属性定位[同级算1个,[]1开始]
driver.find_element_by_xpath('//input[@text =''aa'']')
driver.find_element_by_xpath('//input[text() = ''aa'']')
driver.find_element_by_xpath('//input[contains(@text,''aa'')]')
driver.find_element_by_xpath('//input[list()]')		            # 最后一个
driver.find_element_by_xpath('//input[position<3]')	            # 小于3的
driver.find_element_by_xpath("//form[@cid='form']/span/input")
driver.find_element_by_xpath("//input[@id='kw' and @class='su']")
driver.find_element_by_class_name("class_name")     # 用元素的class定位
driver.find_element_by_tag_name("")                 # 用元素的标签名定位
driver.find_element_by_link_text("")                # 是链接的元素可以用链接文字定位
driver.find_element_by_partial_link_text("")        # 是链接的元素可以用链接文字的部分文字定位
driver.find_element_by_css()                        # 元素的样式定位


# 3.获取元素信息
get_attribute(name)     # 获取元素中属性的值
Is_displayed()          # 设置该元素是否用户可见


# 4. 对元素操作
driver.find_element_by_id("id").click()          # 点击
driver.find_element_by_id("id").send_keys("")    # 模拟按键输入
driver.find_element_by_id("id").submit()         # 提交表单
driver.find_element_by_id("id").clear()          # 清空
size1 = driver.find_element_by_id("id").size     # 获取元素的尺寸信息
text1 = driver.find_element_by_id("id").text     # 获取元素的文本信息
# driver.find_element_by_partial_link_text().location
# driver.find_element_by_partial_link_text().tag_name
# driver.find_element_by_partial_link_text().rect
driver.find_element_by_id("id").is_enabled()    # 设置该元素是否能用
driver.find_element_by_id("id").is_displayed()  # 设置该元素是否用户可见
driver.find_element_by_id("id").is_selected()   # 设置该元素是否可选择

# 5.切换窗口,页面
handle = driver.current_window_handle   # 获得当前窗口句柄,handle是一个数组
driver.switch_to.window(handle[0])      # 窗口切换

# 5. select模块处理下拉框
# from selenium.webdriver.support.select import Select
# Select(元素对象).select_by_value()    根据value值选择
# Select(元素对象).select_by_index()    根据索引选择
# Select(元素对象).select_by_visible_text()     根据文本值选择
# Select(元素对象).deselect_all()       全部取消


# 6. checkbox和radio
# 点击来进行勾选和取消
# 焦点在元素身上的时候按空格来进行勾选和取消


# 7.提示框处理
# alert : 只有一个确定按钮
# confirm:  由确定和取消按钮
# prompt:  有文字输入框


# 8. 模拟键盘操作
# from selenium.webdriver.common.keys import Keys
# driver.find_element_by_id().send_keys(Keys.ENTER)


# 9. 模拟鼠标操作
# from selenium.webdriver import ActionChains
# 所有模拟鼠标的操作,都必须要加perform方法
# ActionChains(driver).move_to_element(元素对象).perform()




# driver.switch_to.frame()	通过frame的name
# driver.switch_to.parent_frame()	切换到父类
# driver.switch_to.default_content()	切换到默认frame




# 11. 控制浏览器
# driver.maximize_window()
# driver.minimize_window()
# driver.get_window_rect()
# driver.set_window_rect()		设置窗口大小和窗口位置
# driver.get_window_position()
# driver.set_window_position()	设置窗口位置
# driver.get_window_size()
# driver.set_window_size()	设置窗口大小
# driver.forward()		浏览器前进
# driver.back()		浏览器后退
# driver.quit()
# driver.close()
# driver.refresh()
# driver.current_window_handle
# driver.window_handles
# driver.switch_to.window(handle)

# driver.switch_to.alert.accept()	接受现有提示框
# driver.switch_to.alert.dismiss()	解散现有提示框
# Send_keys(keysToSend): 发送文本至提示框

接口

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-qRZHqr6q-1639273273504)(测试.assets/截图.png)]

安全

劫持cookie原理:document.cookie获取cookie,通过ajax上传

var a = document.getElementById(id);
a.innerText = '更新的文本';	// 修改文本
a.innerText可用于XSS攻击。

TestNG 测试架构

概述

TestNG支持单元自动化测试另外,它还可以集成Selenium、Appium和HttpClient等框架做各种类型的自动化测试。

优点:

  • 强大的注解功能。
  • 数据驱动。
  • 灵活的测试配置。
  • 支持多种并发测试策略。
  • 可以和多种工具(插件)协同使用,比如Eclipse、IntelliJ IDEA和Maven等;

IEDA环境准备

1、导入testNG架包

2、勾选默认监听器

3、插件Create TestNG XML

功能表

功能Junit4TestNG
测试注解@Test@Test
套件测试@RunWith和@Suite标签
在套件中的所有测试运行之前运行-@BeforeSuite
在套件中的所有测试运行之后运行-@AfterSuite
测试之前运行-@BeforeTest
测试之后运行-@AfterTest
分组测试-@Test的group参数
在调用属于任何这些组的 第一个参数方法之前运行-@BeforeGroups
在调用属于任何这些组的 第一个参数方法之后运行-@AfterGroups
在调用当前类的 第一个参数方法之前运行@BeforeClass@BeforeClass
在调用当前类的 第一个参数方法之后运行@AfterClass@AfterClass
在每个测试方法之前运行@Before@BeforeMethod
在每个测试方法之后运行@After@AfterMethod
忽略测试@ignore@Test(enbale=false)
预期的异常@Test(expected=
ArithmeticException.class)
@Test(expectedException=
ArithmeticException.class)
超时测试@Test(timeout=)@Test(timeout=)
参数化参数@RunWith和@Parameter@Parameters和Dateprovider
依赖测试-@Test的dependsOnMethods参数

注解

注解分为4类

(1)前置条件和后置条件

@BeforeSuite     在该套件的所有测试都运行在注释的方法之前,仅运行一次(套件测试是一起运行的多个测试类)。
@AfterSuite      在该套件的所有测试都运行在注释方法之后,仅运行一次。
@BeforeClass     在调用当前类的第一个测试方法之前运行,注释方法仅运行一次。
@AfterClass      在调用当前类的第一个测试方法之后运行,注释方法仅运行一次
@BeforeTest      注释的方法将在属于<test>标签内的类的所有测试方法运行之前运行。
@AfterTest       注释的方法将在属于<test>标签内的类的所有测试方法运行之后运行。
@BeforeGroups    配置方法将在之前运行组列表。 此方法保证在调用属于这些组中的任何一个的第一个测试方法之前不久运行。
@AfterGroups     此配置方法将在之后运行组列表。该方法保证在调用属于任何这些组的最后一个测试方法之后不久运行。
@BeforeMethod    注释方法将在每个测试方法之前运行。
@AfterMethod     注释方法将在每个测试方法之后运行。

(2)数据驱动

@Parameters      描述如何将参数传递给@Test方法。需要和testng.xml文件配合。
@DataProvider    标记一种方法来提供测试方法的数据。 注释方法必须返回一个Object [] [],其中每个Object []可以被分配给测试方法的参数列表。 要从该DataProvider接收数据的@Test方法需要使用与此注释名称相等的dataProvider名称。

Parameters

    @Test
    @Parameters({"param", "param2"})
    public void printParameters(String param, String param2){
        System.out.println("param参数值为 : " + param);
        System.out.println("param2参数值为 : " + param2);
    }
<suite name="parameterTester">
    <test name="login">
        <parameter name="param"  value="param的值"/>
        <parameter name="param2"  value="param2的值"/>
        <classes>
            <class name="zui.TestClassTest" />
        </classes>
    </test>
</suite>

DataProvider

public class TestParameter2  {
    @DataProvider(name="user")
    public Object[][] Users(){
        return new Object[][]{
                {"root","passowrd"},
                {"cnblogs.com", "tankxiao"},
                {"tank","xiao"}
        };
    }
    @Test(dataProvider="user")
    public void verifyUser(String userName, String password){
        System.out.println("Username: "+ userName + " Password: "+ password);
    }
}

(3)测试用例

// 1.是否执行
@Test(enable = true/false)

// 2.预期异常
@Test(expectedException = ClassName.class)
@Test(expectedException = {ClassName.class,ClassName2})

// 3.超时timeOut,单位毫秒
@Test(timeOut = )

// 4.分组groups
/* 	(1)把<test>标签内的所有类方法进行分组;
	(2)分组的最小维度为方法,当把带分组的@Test(groups = ”groupName”)注解对类使用时,这个测试类中的所有方法都属于这同一个组;
	(3)一个方法也可以同时属于多个组,@Test(groups = {“groupName1”, “groupName2”}),那么每组运行时这个方法都会被执行一次;
	(4)同一个组里的方法类,如果分别属于两个不同的测试用例(<test>)内,那么它们其实可以算两个组,它们会在每个测试用例分别运行,而不会合在一起运行;
*/

//5、依赖方法dependsOnMethods
在被依赖的方法运行完成之后运行当前方法,如果依赖方法测试不通过,那么当前方法也不会继续运行了;依赖的方法可以有多个;
例:@Test(dependsOnMethods = { "methodName1" , “methodName2” })

//6、依赖组,dependsOnGroups
和依赖方法类似,在被依赖组运行完成之后运行当前组,如果依赖组中的方法没有测试能过,那么当前的方法也不会继续运行了;依赖组可以有多个;
    
    
description代表测试用例描述,控制台会打印输出该描述

(4)监听器

test.xml配置

<!-- groups只有被选组的方法才会执行-->

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE suite SYSTEM "https://testng.org/testng-1.0.dtd" >
<suite name="Suite1" >
    <test name="login" >
        <groups>
            <run>
                <include name="method-group1"/>
                <include name="method-group2"/>
            </run>
        </groups>
        <classes>
            <class name="zui.TestClassTest"/>
        </classes>
    </test>
</suite>

<suite>  套件,根标签,通常由几个<test组成>
  属性:
  name            套件的名称,必须属性;
  verbose         运行的级别或详细程度;
  parallel        是否运行多线程来运行这个套件;
  thread-count    如果启用多线程,用于指定开户的线程数;
  annotations     在测试中使用的注释类型;
  time-out        在本测试中的所有测试方法上使用的默认超时时间; 
<test>    测试用例,name为必须属性;
<classes>  用例中包含的类,子标签为<class name=”className”>;
<class>    测试类,其中属性name为必须属性;;
<packages> 用例中包含的包,包中所有的方法都会执行,子标签为<package name=”packageName”>;
<package>  测试包,name为必须属性;
<methods>  指定测试类中包含或排除的方法,子类为<include>,<exclude>;
<include>  指定需要测试的方法,name为必须属性;
<exclude>  指定类中不需要测试的方法,name为必须属性;
<groups>   指定测试用例中要运行或排除运行的分组,子标签为<run>,<run>下包含<include>,<exclude>标签,<include>,<exclude>的name指定运行、不运行的分组;

断言

assertEqual ([String message], expected value, actual value)        //断言两个值相等。值可能是类型有 int, short, long, byte, char or java.lang.Object. 第一个参数是一个可选的字符串消息;
Assert.assertTrue([String message], boolean condition)                断言一个条件为真;
assertFalse([String message],boolean condition)              断言一个条件为假;
assertNotNull([String message], java.lang.Object object)           断言一个对象不为空(null);
assertNull([String message], java.lang.Object object)            断言一个对象为空(null);
assertSame([String message], java.lang.Object expected, java.lang.Object actual)       断言两个对象引用相同的对象;
assertNotSame([String message], java.lang.Object unexpected, java.lang.Object actual)    断言两个对象不是引用同一个对象;
assertArrayEquals([String message], expectedArray, resultArray)                  断言预期数组和结果数组相等。数组的类型可能是 int, long, short, char, byte or java.lang.Object.;

testNG.dtd文档

<!-- A suite is the top-level element of a testng.xml file                  -->
<!ELEMENT suite (groups?,(listeners|packages|test|parameter|method-selectors|suite-files)*) >
<!元素	套件	(组?,(侦听器		|包		|测试|参数		|方法选择器		|套件文件)*>

<!-- Attributes: -->
<!--
@attr  name        此套件的名称(将显示在报告中)
@attr  junit       是否在JUnit模式下运行
@attr  verbose     控制台上的输出将有多详细,此设置对HTML报告没有影响。
@attr  parallel   TestNG是否应该使用不同的线程来运行测试(可能会加快进程),不要使用“true”和“false”值,它们现在已被弃用。
@attr  parent-module   用于创建套件测试中使用的所有guice注入器的父注入器的模块。
@attr  guice-stage 		The stage with which the parent injector is created
@attr  configfailurepolicy  在类/方法失败一次后,是继续在类/方法之前/之后尝试,还是跳过剩余的。
@attr  thread-count 		一个整数,指定设置为并行时要使用的线程池的大小。
@attr  annotations  	如果是“javadoc”,TestNG将在源代码中查找javadoc注释,否则将使用JDK5注释。
@attr  time-out    中止方法(如果parallel=“methods”)或测试(parallel=“tests”)之前的等待时间(以毫秒为单位)。
@attr  skipfailedinvocationcounts 是否跳过失败的调用
@attr  data-provider-thread-count 一个整数,给出用于并行数据提供程序的线程池的大小。
@attr  object-factory 		实现将用于实例化测试对象的IObjectFactory的类。
@attr allow-return-values 	如果为true,则返回值的测试也将运行。
-->
<!ATTLIST suite
    name CDATA #REQUIRED
    junit (true | false) "false"
    verbose CDATA #IMPLIED
    parallel (false | true | none | methods | tests | classes | instances) "none"
    parent-module CDATA #IMPLIED
    guice-stage (DEVELOPMENT | PRODUCTION | TOOL) "DEVELOPMENT"
    configfailurepolicy (skip | continue) "skip"
    thread-count CDATA "5"
    annotations CDATA #IMPLIED
    time-out CDATA #IMPLIED
    skipfailedinvocationcounts (true | false) "false"
    data-provider-thread-count CDATA "10"
    object-factory CDATA #IMPLIED
    group-by-instances (true | false) "false"
    preserve-order (true | false) "true"
    allow-return-values (true | false) "false"
    >

<!-- A list of XML files that contain more suite descriptions -->
<!ELEMENT suite-files (suite-file)* >

<!ELEMENT suite-file ANY >
<!ATTLIST suite-file
    path CDATA #REQUIRED
    >

<!--
Parameters can be defined at the <suite> or at the <test> level.
Parameters defined at the <test> level override parameters of the same name in <suite>
Parameters are used to link Java method parameters to their actual value, defined here.
-->
<!ELEMENT parameter ANY>
<!ATTLIST parameter
    name CDATA #REQUIRED
    value CDATA #REQUIRED >

<!--
Method selectors define user classes used to select which methods to run.
They need to implement <tt>org.testng.IMethodSelector</tt>
-->
<!ELEMENT method-selectors (method-selector*) >
<!ELEMENT method-selector ((selector-class)*|script) >
<!ELEMENT selector-class ANY>
<!ATTLIST selector-class
    name CDATA #REQUIRED
    priority CDATA #IMPLIED
    >
<!ELEMENT script ANY>
<!ATTLIST script
    language CDATA #REQUIRED
    >

<!--
测试包含参数和类。此外,您还可以定义其他组(“组的组”)
-->

<!ELEMENT test (method-selectors?,parameter*,groups?,packages?,classes?) >
<!元素	测试(方法选择器?、参数*、组?、包?、类?>

<!--
name         此测试的名称(将出现在报告中)
junit        是否在junit模式下运行.
verbose      控制台上输出的详细程度,此设置对HTML报告没有影响。默认值:套件级详细。
parallel     TestNG是否应该使用不同的线程来运行测试(可能会加快进程),不要使用“true”和“false”值,它们现在已被弃用。
thread-count 	一个整数,给出在以下情况下要使用的线程池的大小:采用并行模式。覆盖套件级别的值。
annotations  	如果是“javadoc”,TestNG将查找在源代码中添加JavaDoc注释,否则它将使用JDK5注释。
time-out     	中止前等待的时间(以毫秒为单位)方法(如果parallel=“methods”)或测试(如果parallel=“tests”)。
enabled      	启用/禁用当前测试的标志。默认值:true。
skipfailedinvocationcounts 	是否跳过失败的调用
preserve-order 				如果为true,则此标记中的类将按与相同的顺序运行在XML文件中找到。
allow-return-values 		如果为true,则返回值的测试也将运行。
-->
<!ATTLIST test
    name CDATA #REQUIRED
    junit (true | false) "false"
    verbose  CDATA #IMPLIED
    parallel  (false | true | none | methods | tests | classes | instances) #IMPLIED
    thread-count CDATA #IMPLIED
    annotations  CDATA #IMPLIED
    time-out CDATA #IMPLIED
    enabled (true | false) #IMPLIED
    skipfailedinvocationcounts (true | false) "false"
    preserve-order (true | false) "true"
    group-by-instances (true | false) "false"
    allow-return-values (true | false) "false"
    >

<!--
Defines additional groups ("groups of groups") and also which groups to include in this test run
-->
<!--定义其他组(“组的组”)以及在此测试运行中包括哪些组-->
<!ELEMENT groups (define*,run?,dependencies?) >

<!ELEMENT define (include*)>
<!ATTLIST define
    name CDATA #REQUIRED>

<!-- Defines which groups to include in the current group of groups         -->
<!-- 定义要包含在当前组组中的组-->
<!ELEMENT include ANY>
<!ATTLIST include
    name CDATA #REQUIRED
    description CDATA #IMPLIED
    invocation-numbers CDATA #IMPLIED>

<!-- Defines which groups to exclude from the current group of groups       -->
<!-- 定义要从当前组组中排除的组-->
<!ELEMENT exclude ANY>
<!ATTLIST exclude
    name CDATA #REQUIRED>

<!-- The subtag of groups used to define which groups should be run         -->
<!-- 用于定义应运行哪些组的组的子标记-->
<!ELEMENT run (include?,exclude?)* >

<!ELEMENT dependencies (group*)>

<!ELEMENT group ANY>
<!ATTLIST group
    name CDATA #REQUIRED
    depends-on CDATA #REQUIRED>

<!-- The list of classes to include in this test                            -->
<!ELEMENT classes (class*,parameter*) >
<!ELEMENT class (methods|parameter)* >
<!ATTLIST class
    name CDATA #REQUIRED >

<!-- The list of packages to include in this test                           -->
<!-- 要包含在此测试中的包列表-->
<!ELEMENT packages (package*) >
<!-- The package description.
     If the package name ends with .* then subpackages are included too.
-->
<!ELEMENT package (include?,exclude?)*>
<!ATTLIST package
    name CDATA #REQUIRED >

<!-- The list of methods to include/exclude from this test                 -->
<!-- 要从此测试中包括/排除的方法列表-->
<!ELEMENT methods (include?,exclude?,parameter?)* >

<!-- The list of listeners that will be passed to TestNG -->
<!-- 将传递给TestNG的侦听器列表-->
<!ELEMENT listeners (listener*) >

<!ELEMENT listener ANY>
<!ATTLIST listener
    class-name CDATA #REQUIRED >
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值