测试用例命名,测试用例名称命名规范

Pytest测试框架知识

pytest是一个非常成熟的全功能的Python测试框架,主要有以下几个特点:

1.简单灵活,容易上手

2.支持参数化

3.能够支持简单的单元测试和复杂的功能测试,还可以用来做selenium/appnium等自动化测试、接口自动化测试(pytest+requests)

4.pytest具有很多第三方插件,并且可以自定义扩展,比较好用的如pytest-selenium(集成selenium)、pytest-html(完美html测试报告生成)、pytest-rerunfailures(失败case重复执行)、pytest-xdist(多CPU分发)等

5.测试用例的skip和xfail处理

6.可以很好的和jenkins集成

7.report框架----allure 也支持了pytest

使用命令

查看是否安装成功及安装的版本信息

pytest官方文档:

注意pytest有如下约束:

1、测试模块文件(.py文件)命名应该以 test_开头或者以_test结尾。

2、测试类命名应当以Test开头。表示一个项目或者一个模块的用例集合

3、测试用例(函数)命名,测试函数的方法命名应该以test_开头。

注意 :测试类的不应该有构造函数,也就是不能有 __init__ 出现

案例新建一个python文件,命名为:test_example1:

执行后,可以看到,运行了test_example1文件下Test_Login测试类和Test_Login2测试类中的三个测试用例

参数详解:

-s: 表示输出调试信息,包括print打印的信息

-v: 显示更详细的信息

-vs: 两个参数一起用

-n: 支持多线程或分布式运行用例

-return NUM: 失败用例重跑,num失败后重跑的次数

-x: 表示只要有一个用例报错,那么测试停止

--maxfall=2 : 出现两个用例失败就停止

-k: 根据测试用例的步伐字符串指定测试用例

如:pytest -vs ./testcase -k "ao"

--html ./report/report.html : 会在之指定路径下生成html的报告

pytest.ini这个文件它是pytest单元测试框架的核心配置文件

1、位置:一般放在项目的跟目录下

2、编码:必须是ANSI,可以使用notpad++修改编码格式

3、作用:改变pytest默认的行为

4、运行规则:不管是主函数的模式运行,命令模式运行,都会去读取这个配置文件

unittes框架 :是根据ASCII的大小来决定执行的顺序

pytest框架:默认从上到下

一、测试用例的基本要素

1、用例编号:测试用例的编号有一定的规则,比如系统测试用例的编号定义规则:MS-ST-001,命名规则是项目名称+测试阶段类型(系统测试阶段)+编号。编号是为了查找测试用例,便于测试用例的跟踪。 2、测试项目:要测试项目的名称,可以是测试用例所属的大类,被测需求,被测模块或者是被测的单元。 3、测试标题:对测试用例的描述,测试用例标题应该清楚表达测试用例的用途。比如”测试用户登录时输入错误密码时,软件的响应情况“。 4、重要级别:定义测试用例的优先级别,可以分为”高“、”中“、”低“三个级别。     高:保证系统基本功能、重要特性、实际使用频率比较高的用例;     中:重要程度介于高和低之间的测试用例;     低:实际使用频率不高,对系统业务功能影响不大的模块或功能的测试用例。 一般如果软件需求的优先级是”高“,那么针对该需求的测试用例优先级也是”高“;反过来也是一样。 5、预置条件:就是执行当前测试用例的前提描述,如果不满足这些条件,则无法进行测试。 6、测试输入:测试用例执行时,需要输入的外部信息。 7、操作步骤:执行当前测试用例所要经过的操作步骤,需要给出每一步操作的详细描述,测试人员根据测试用例操作步骤,完成测试用例的执行。 8、预期结果:当前测试用例的预期输出结果,用来与实际结果比较,如果相同则该测试用例通过,否则该测试用例失败。 以上八个要素是最重要的,下面这些选写: 10、创建时间:写用例的日期 11、修改日期:最后一个修改用例的日期 12、测试结果:执行用例后的结果:pass、fail、block

测试用例设计方法有哪些?

1、等价类划分为每个输入划分等价类,得到等价类表,为每个等价类规定一个唯一编号。设计一个测试用例,使其尽可能多的覆盖所有尚未覆盖的有效等价类。重复这一步骤,使得有效等价类均被测试用例所覆盖设计一个测试用例,使其只覆盖一个无效等价类。重复这一步骤使得所有无效等价类均被覆盖。2、边界值分析从测试规格中分析得到输入参数类型,对于输入等价类划分方法进行等价类的划分,运用域测试分析方法确定域范围的边界(上点、离点与内点)。如果存在多个输入域,则需要运用因果图、判定表方法这些输入域边界值的组合情况进行进一步分析,选择这些上点、离点与内点或者这些点的组合形成测试项。3、判定表判定表是分析和表达多种输入条件下系统执行不同动作的工具,它可以把复杂的逻辑关系和多种条件组合的情况表达得既具体又明确。列出所有的条件桩和动作桩,填入条件桩、条件项和动作桩、动作项,化简,合并相似规则,将每条规则转化为用例。基本格式1、用例编号测试用例的编号有一定的规则,比如系统测试用例的编号这样定义规则:PROJECT1-ST-001,命名规则是项目名称+测试阶段类型(系统测试阶段)+编号。定义测试用例编号,便于查找测试用例,便于测试用例的跟踪。2、测试标题对测试用例的描述,测试用例标题应该清楚表达测试用例的用途。比如“测试用户登录时输入错误密码时,软件的响应情况”。3、重要级别定义测试用例的优先级别,可以笼统的分为四个不同的等级。4、输入限制提供测试执行中的各种输入条件。根据需求中的输入条件,确定测试用例的输入。测试用例的输入对软件需求当中的输入有很大的依赖性,如果软件需求中没有很好的定义需求的输入,那么测试用例设计中会遇到很大的障碍。5、操作步骤提供测试执行过程的步骤。对于复杂的测试用例,测试用例的输入需要分为几个步骤完成,这部分内容在操作步骤中详细列出。6、预期结果提供测试执行的预期结果,预期结果应该根据软件需求中的输出得出。如果在实际测试过程中,得到的实际测试结果与预期结果不符,那么测试不通过;反之则测试通过。

测试用例的设计通常包括哪些内容?

软件测试用例的基本要素包括测试用例编号、测试标题、重要级别、测试输入、操作步骤、预期结果,下面逐一介绍。用例编号测试用例的编号有一定的规则,比如系统测试用例的编号这样定义规则: PROJECT1-ST-001 ,命名规则是项目名称+测试阶段类型(系统测试阶段)+编号。定义测试用例编号,便于查找测试用例,便于测试用例的跟踪。测试标题对测试用例的描述,测试用例标题应该清楚表达测试用例的用途。比如 “ 测试用户登录时输入错误密码时,软件的响应情况 ” 。重要级别定义测试用例的优先级别,可以笼统的分为 四个不同的等级输入限制提供测试执行中的各种输入条件。根据需求中的输入条件,确定测试用例的输入。测试用例的输入对软件需求当中的输入有很大的依赖性,如果软件需求中没有很好的定义需求的输入,那么测试用例设计中会遇到很大的障碍。操作步骤提供测试执行过程的步骤。对于复杂的测试用例,测试用例的输入需要分为几个步骤完成,这部分内容在操作步骤中详细列出。预期结果提供测试执行的预期结果,预期结果应该根据软件需求中的输出得出。如果在实际测试过程中,得到的实际测试结果与预期结果不符,那么测试不通过;反之则测试通过。

在项目中怎么用junit写单元测试用例

首先我们需要先下载相应的 JUnit 相关的 JAR 包,下载的过程可以去 JUnit 的官方网站,也可以直接通过 Maven 资源仓库来完成。使用简单的 @Test 注解实现我们的测试方法的编写和执行准备工作做好之后,接下来我们就可以开始尝试编写壹个简单的测试代码了。首先,我们编写了壹个 Calculator 类,并提供五个方法分别完成加减乘除以及求平方的运算。代码如下:package net.oschina.bairrfhoinn.main;public class Calculator {public void add(int n){result += n;}public void substract(int n){result -= n;}public void multiply(int n){result *= n;}public void divide(int n){result /= n;}public void square(int n){result = n * n;}public int getReuslt(){return result;}public void clear(){result = 0;}private static int result;}在测试类中用到了JUnit4框架,自然要把相应地Package包含进来。最主要地一个Package就是org.junit.*。把它包含进来之后,绝大部分功能就有了。还有一句话也非常地重要“import static org.junit.Assert.*;”,我们在测试的时候使用的壹系列assertEquals()方法就来自这个包。大家注意壹下,这是壹个静态包含(static),是JDK5中新增添的壹个功能。也就是说,assertEquals是Assert类中的壹系列的静态方法,壹般的使用方式是Assert. assertEquals(),但是使用了静态包含后,前面的类名就可以省略了,使用起来更加的方便。另外要注意的是,我们的测试类是壹个独立的类,没有任何父类。测试类的名字也可以任意命名,没有任何局限性。所以我们不能通过类的声明来判断它是不是一个测试类,它与普通类的区别在于它内部的方法的声明,我们接着会讲到。在测试类中,并不是每壹个方法都是用于测试的,所以我们必须使用“注解”来明确表明哪些是测试方法。“注解”也是JDK5的壹个新特性,用在此处非常恰当。我们可以看到,在某些方法的前有@Before、@Test、@Ignore等字样,这些就是注解,以壹个“@”作为开头。这些注解都是JUnit4自定义的,熟练掌握这些注解的含义,对于编写恰当的测试类非常重要。接下来我们创建壹个测试类 CalculatorTest.java,代码如下:package net.oschina.bairrfhoinn.test;import static org.junit.Assert.*;import org.junit.Test;import net.oschina.bairrfhoinn.main.Calculator;public class CalculatorTest {private static Calculator calculator = new Calculator();@Testpublic void testAdd(){calculator.add(7);calculator.add(8);assertEquals(15, calculator.getReuslt());}}首先,我们要在方法的前面使用@Test标注,以表明这是壹个测试方法。对于方法的声明也有如下要求:名字可以随便取,没有任何限制,但是返回值必须为void,而且不能有任何参数。如果违反这些规定,会在运行时抛出壹个异常。至于方法内该写些什么,那就要看你需要测试些什么了。比如上述代码中,我们想测试壹下add()方法的功能是否正确,就在测试方法中调用几次add函数,初始值为0,先加7,再加8,我们期待的结果应该是15。如果最终实际结果也是15,则说明add()方法是正确的,反之说明它是错的。assertEquals(15, calculator.getResult());就是用来判断期待结果和实际结果是否相等,其中第壹个参数填写期待结果,第二个参数填写实际结果,也就是通过计算得到的结果。这样写好之后,JUnit 会自动进行测试并把测试结果反馈给用户。如果想运行它,可以在 eclipse 的资源管理器中选择该类文件,然后点击右键,选择 Run As->JUnit Test 即可看到运行结果。使用@Test 的属性 Ignore 指定测试时跳过这个方法如果在写程序前做了很好的规划,那么哪些方法是什么功能都应该实现并且确定下来。因此,即使该方法尚未完成,他的具体功能也是确定的,这也就意味着你可以为他编写测试用例。但是,如果你已经把该方法的测试用例写完,但该方法尚未完成,那么测试的时候无疑是“失败”。这种失败和真正的失败是有区别的,因此 JUnit 提供了壹种方法来区别他们,那就是在这种测试函数的前面加上 @Ignore 标注,这个标注的含义就是“某些方法尚未完成,暂不参与此次测试”。这样的话测试结果就会提示你有几个测试被忽略,而不是失败。壹旦你完成了相应函数,只需要把@Ignore标注删去,就可以进行正常的测试。比如说上面的测试类 Calculator.java 中,假设我们的 Calculator 类的 multiply() 方法没有实现,我们可以在测试类 CalculatorTest 中先写如下测试代码:package net.oschina.bairrfhoinn.test;import static org.junit.Assert.*;import org.junit.Ignore;import org.junit.Test;import net.oschina.bairrfhoinn.main.Calculator;public class CalculatorTest {private static Calculator calculator = new Calculator();... //此处代码省略@Ignore("mod square() not implemented, please test this later...")@Testpublic void testSquare(){calculator.square(3);assertEquals(9, calculator.getReuslt());}}我们再运行壹次测试,会看到如下结果,从图中可以很明显的看出,方法testSquare() 上的 @Ignore 注解已经生效了,运行时直接跳过了它,而方法testAdd()仍然正常的运行并通过了测试。使用注解 @Before 和 @After 来完成前置工作和后置工作前置工作通常是指我们的测试方法在运行之前需要做的壹些准备工作,如数据库的连接、文件的加载、输入数据的准备等需要在运行测试方法之前做的事情,都属于前置工作;类似的,后置工作则是指测试方法在运行之后的壹些要做的事情,如释放数据库连接、输入输出流的关闭等;比如我们上面的测试,由于只声明了壹个 Calculator 对象,他的初始值是0,但是测试完加法操作后,他的值就不是0了;接下来测试减法操作,就必然要考虑上次加法操作的结果。这绝对是壹个很糟糕的设计!我们非常希望每壹个测试方法都是独立的,相互之间没有任何耦合度。因此,我们就很有必要在执行每壹个测试方法之前,对Calculator对象进行壹个“复原”操作,以消除其他测试造成的影响。因此,“在任何壹个测试方法执行之前必须执行的代码”就是壹个前置工作,我们用注解 @Before 来标注它,如下例子所示:package net.oschina.bairrfhoinn.test;...import org.junit.After;import org.junit.Before;import org.junit.Ignore;import org.junit.Test;public class CalculatorTest {...//这里省略部分代码@Beforepublic void setUp() throws Exception {calculator.clear();}@Afterpublic void tearDown() throws Exception {System.out.println("will do sth here...");}...//这里省略部分代码}另外要说的是,注解 @Before 是定义在 org.junit.Before 这个类中的,因此使用时需要将其引入我们的代码中。这样做了之后,每次我们运行测试方法时,JUnit 都会先运行 setUp() 方法将 result 的值清零。不过要注意的是,这里不再需要 @Test 注解,因为这并不是壹个 test,只是壹个前置工作。同理,如果“在任何测试执行之后需要进行的收尾工作,我们应该使用 @After 来标注,方法与它类似。由于本例比较简单,不需要用到此功能,所以我们只是简单了给它添加了壹个 tearDown() 方法并在收尾时打印壹句话到控制台,并且使用 @After 来注解这个方法。使用@BeforeClass 和 @AfterClass 来完成只需要执行壹次的前置工作和后置工作上面我们提到了两个注解 @Before 和 @After ,我们来看看他们是否适合完成如下功能:有壹个类负责对大文件(超过500 MB)进行读写,他的每壹个方法都是对文件进行操作。换句话说,在调用每壹个方法之前,我们都要打开壹个大文件并读入文件内容,这绝对是壹个非常耗费时的操作。如果我们使用 @Before 和 @After ,那么每次测试都要读取壹次文件,效率及其低下。所以我们希望的是,在所有测试壹开始读壹次文件,所有测试结束之后释放文件,而不是每次测试都读文件。JUnit的作者显然也考虑到了这个问题,它给出了@BeforeClass 和 @AfterClass 两个注解来帮我们实现这个功能。从名字上就可以看出,用这两个注解标注的函数,只在测试用例初始化时执行 @BeforeClass 方法,当所有测试执行完毕之后,执行 @AfterClass 进行收尾工作。在这里要注意壹下,每个测试类只能有壹个方法被标注为 @BeforeClass 或 @AfterClass,而且该方法必须是 public static 类型的。使用@Test 的属性 timeout 来完成限时测试,以检测代码中的死循环现在假设我们的 Calculator 类中的 square() 方法是个死循环,那应该怎么办呢,比如说像下面这样:public void square(int n){for(;;){}}如果测试的时候遇到死循环,你的脸上绝对不会露出笑容的。因此,对于那些逻辑很复杂,循环嵌套比较深的、有可能出现死循环的程序,因此壹定要采取壹些预防措施。限时测试是壹个很好的解决方案。我们给这些测试函数设定壹个预期的执行时间,超过了这壹时间,他们就会被系统强行终止,并且系统还会向你汇报该函数结束的原因是因为超时,这样你就可以发现这些 Bug 了。要实现这壹功能,只需要给 @Test 标注加壹个参数timeout即可,代码如下:@Test(timeout=2000L)public void testSquare() {calculator.square(3);assertEquals(9, calculator.getReuslt());}timeout参数表明了你预计该方法运行的时长,单位为毫秒,因此2000就代表2秒。现在我们让这个测试方法运行壹下,看看失败时是什么效果。使用@Test 的属性expected来监控测试方法中可能会抛出的某些异常JAVA中的异常处理也是壹个重点,因此你经常会编写壹些需要抛出异常的函数。如果你觉得壹个函数应该抛出异常,但是它没抛出,这算不算 Bug 呢?这当然是Bug,JUnit 也考虑到了这壹点,并且可以帮助我们找到这种 Bug。例如,我们写的计算器类有除法功能,如果除数是壹个0,那么必然要抛出“除0异常”。因此,我们很有必要对这些进行测试。代码如下:@Test(expected=java.lang.ArithmeticException.class)public void testDivide(){calculator.divide(0);}如上述代码所示,我们需要使用@Test注解中的expected属性,将我们要检验的异常(这里是 java.lang.ArithmeticException)传递给他,这样 JUnit 框架就能自动帮我们检测是否抛出了我们指定的异常。指定 JUnit 运行测试用例时的 Runner大家有没有想过这个问题,当你把测试代码提交给JUnit框架后,框架是如何来运行你的代码的呢?答案就是Runner。在JUnit中有很多个Runner,他们负责调用你的测试代码,每壹个Runner都有其各自的特殊功能,你要根据需要选择不同的Runner来运行你的测试代码。可能你会觉得奇怪,前面我们写了那么多测试,并没有明确指定壹个Runner啊?这是因为JUnit中有壹个默认的Runner,如果你没有指定,那么系统会自动使用默认Runner来运行你的代码。换句话说,下面两段代码含义是完全壹样的:import org.junit.runner.RunWith;import org.junit.runners.JUnit4;@RunWith(JUnit4.class)public class CalculatorTest {...//省略此处代码}//用了系统默认的JUnit4.class,运行效果完全壹样public class CalculatorTest {...//省略此处代码}

如何写出完美的测试用例

*用例编号 命名规范:模块英文名_001 ,首字母大写*用例名称 一个完整的句子; 可以直观表达本条用例的意图; 用条件描述用例标题,而不是参数描述用例标题; 如果一个用例中包含多个参数,用例中应该是每个参数的取值; 不要超过30个汉字;所属模块 所属的功能模块,可以再细分为子模块前置条件 用例执行的前置条件测试数据 用例执行的用的测试数据*用例步骤 测试步骤不要多于7步; 不要在测试用例中引用别的测试用例,如果测试用例2需要测试用例1执行后才能执行: 1.将用例1和用例2合并成一个大的用例;----适合用例简单的情况 2.将用例1简述后作为用例2的前置条件; 避免包含过多的用户细节; 在测试步骤后和预期结果前加标签,明确操作后执行的结果,示例: 操作步骤:1.同时按住绘本键+音乐键3s;[chek1] 2.在APP上输入正确的WiFi名称和密码进行连接;[chek2] 预期结果:[chek1]进入配网模式,播放进入配网模式提示音,黄灯呼吸; [chek2]联网成功,退出配网模式,播放联网成功提示音,灯光关闭; 避免在测试步骤中使用笼统的词汇:将笼统的词汇量化,如反复---100次,长时间:24小时,大量:1000个;*预期结果 预期结果一定是明确的,没有不确定性; 预期结果不要多余5个,不要少于1个;优先级 用例执行的优先级用例等级 将用例划分为不同等级,根据不同的质量等级执行不同等级的用例注: ①单条必须是可独立执行的 ②带*号为常规用例必须,其他根据实际情况选择添加 ③此规范适用于编写完整测试用例时,简化的测试用例可以只包含用例标题、预期结果;

返回顶部