JUnit Test Assert

Posted 人类能走多远

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了JUnit Test Assert相关的知识,希望对你有一定的参考价值。

断言 是测试的心脏,就是 判断 预期的内容 是否与实际一致,就是手动测试的 精髓

1)、我们在使用一个断言(中 那些方法,比如assertEquals等)可以静态一次性导入 Assert类。
import static org.junit.Assert.*;

2)、 JUnit框架 用一组Assert 方法封装了最常见的测试任务 ,这些Assert方法极大地简化了单元测试的编写
(我擦,这不就意味着一些复杂的测试任务 得你自己来写方法,自己去new,来进行测试)

3)Assert类包含了一组静态的测试方法,用于验证期望值expected和实际值actual逻辑比对是否正确,即测试失败,标志为未通过测试。

如果期望值和实际值比对失败,Assert类就会抛出一个AssertionFailedError异常,Junit测试框架将这种错误归入Fails并且加以记录。

每一个Assert类所属的方法都会被重载(OverLoaded),如果指定了一个String类型的传参则该参数将被做为AssertionFailedError异常的标识信息,告诉测试人员该异常的具体信息。

4)、第一
assertEquals(expected, actual, tolerance) 方法里如果传了三个参数,那么 最后一个参数 就是一个误差范围,即实际值在这个误差范围之内 测试就会通过

在使用AssertEquals方法的时候,如果比较的2个参数是double或者float类型的时候,(计算表示浮点型数据都有一定的偏差)

在第3个参数我们还可以传入一个误差范围。如果实际值在(期望值-误差范围)和(期望值+误差范围)内,那么测试通过。

当进行带有输入误差和截断误差的数学运算时,或者当断言一个关于文件修改日期的条件时,这些重载方法就很有用。

第二
fail()
让测试方法失败

注意:上面的每一个方法,都有一个重载的方法,可以在前面加一个String类型的参数,表示如果验证失败的话,将用这个字符串作为失败的结果报告。

比如: assertEquals("Current user Id should be 1", 1, currentUser.id());

当 currentUser.id() 的值不是1的时候,在结果报道里面将显示"Current user Id should be 1",这样可以让测试结果更具有可读性,更清楚错误的原因是什么。

5)、 关于JUnit单元测试框架下 基于注解的 测试用例 为什么“不需要写 main方法” 就能运行呢?
main方法是程序的入口,JUnit直接运行我们的 某个基础注解的方法, 是可行的,说明main方法躲在某个隐蔽的位置了。
在测试方法中,对测试方法所在的类添加Spring的 (Compent注解或者为该类的成员变量添加)Resource注解并没有什么卵用,
即Spring根本不会来扫描这个测试类,更不会为这个类注入属性值。为什么这么说呢?因为Spring是在测试类中由被@Before标注的方法所启动的,
这时候,JVM已经将此测试类实例化了,而这并不是由Spring实例化的,Spring晚了一步,所以在Spring的容器中并没有此类的实例。
那么Junit4真的有main方法吗?没错,既然它能直接运行我们的方法,那它必然自己为JVM提供了程序入口。其实在org.junit.runner包下,有个JUnitCore.class,
其中就有一个 标准的main方法,这就是JUnit入口函数。如此看来,它其实和我们直接在自己的main方法中跑我们要测试的方法在本质上是一样的。



地址: http://www.cnblogs.com/yepei/p/5649352.html JUnit4单元测试的 高级用法
6)、 ; 基于注解的 JUnit生命周期 与 Tomcat的生命周期的区别: 晚上 再来弄
7)、为什么 在@test注解下的 测试方法是 public void的,既不能用private、static修饰,也不能用其他的数据类型如List等。一旦修改 便运行时出错 无法找到这个类。

8)、 345。

一、Suit------它可以一次生执行全面在多个类中的测试用例

二、Parameterized (参数化的)------在普通的单元测试中被@Test注解标注的测试方法只能是public void的,且不能有任何输入参数。而这时常会给我们造成困扰,因为有时候我们需要为测试方法输入参数,甚至是批量指定多个待测参数。这时Parameterized这个Runner就能满足我们的要求

三、Category(分类)------继承自Suit,更强大,它可以让我们对测试类中被测试的方法进行分类执行,例如Person对象具有一些属性,这些属性拥有get/set方法,同时还有一些普通方法。我们可以将获取属性的get方法和普通方法进行分类测试

四、Theories------虽意为原理或推测的意思,但我在这里以更直观的方式表述它:提供一组参数的排列组合值作为待没方法的输入参数。同时注意到在使用Theories这个Runner的时候,我们的待测方法可以拥有输入参数,而这在其它的Runner中的测试方法是不成的

五、有了上面几个 JUnit运行器的使用,基本大部分测试需求都鞥得到解决。 小部分的可以用:Junit4提供的Rule/Assume/Assert等

第一、 其中使用Rule可以为单元测试指定测试规则,下面展示了这些可用的Rule:

Verifier: 验证测试执行结果的正确性。

ErrorCollector: 收集测试方法中出现的错误信息,测试不会中断,如果有错误发生测试结束后会标记失败。

ExpectedException: 提供灵活的异常验证功能。

Timeout: 用于测试超时的Rule。

ExternalResource: 外部资源管理。

TemporaryFolder: 在JUnit的测试执行前后,创建和删除新的临时目录。

TestWatcher: 监视测试方法生命周期的各个阶段。

TestName: 在测试方法执行过程中提供获取测试名字的能力。

第二、Assume表示假设,但它实际上 是对没有方法的 参数进行合法性校检的 ,如果校检不合格则直接抛出异常,而不执行测试
Assume提供的校检规则如下:
assumetrue
assumeNotNull
assummeThat
assumeNotException
举个例子: (通过以下代码 也可以看到,要使用参数,你得使用@theory 注解)
@Theory
public void printAge(String name,int age){
Assume.assumeTrue(age>0); //如果桉树 age<=0,会抛出 AssumetionViolatedException异常
System.out.Println(String.format("sdkjskdjlhfa",name,age))
}

第三、 Assert是Junit提供的断言,与Assume不同,Assert是对测试结果的校验,它提供的检验规则如下:

AssertTrue、AssertFalse:结果的true、false。

AssertThat:使用Matcher做自定义的校验。

AssertEquals、AssertNotEquals:判断两个对象是否相等。

AssertNull、AssertNotNull:判断对象是否为空。

AssertSame:判断两个对象是否为同一个,不同于equals这里是使用“==”判断。

AssertArrayEquals:判断两个数组是否相等。

9)、Action类 主要定义了一些模拟用户的鼠标 mouse,以及键盘keyBoard操作。 我们可以使用perform() 方法进行执行

第一、 一些前面没用过的 Action类的键盘和鼠标事件:
clickAndHold() 在当前鼠标位置 点击 (不释放)

contextClick() 在当前鼠标位置执行上下文点击

doubleClick() 在当前鼠标位置执行双击

dragAndDrog(source,target) 在源位置的位置执行点击并保持,移动到目标元素的位置,然后释放鼠标
参数: source-element(源元素) 用来模拟按钮
target-element(目标元素)移动至目标元US 并释放鼠标

dragAndDropBy(source,x-offset,y-offset) 同理上,将鼠标在源元素点击 通过横移竖移 到指定的目标的元素 释放鼠标

keyDown(modifier_key) Performs a modifier key press.(就是可以按下像Shift、Ctrl等修饰键)

keyUp(修饰符_key) Performs a key release(释放键盘上的 按键)

moveByOffset(x-offset,y-offset) Moves the mouse from its current position (or 0,0) by the given offset
(将键盘移动到指定的 横竖偏移位置)

moveToElement(toElement) Moves the mouse to the middle of the element
(将鼠标移动到 元素的中间)

release() 释放 按住的 鼠标左键

sendKeys(onElement,charsequence) 在元素上发送一连串按键。

第二、使用以上方法 可以进行 组合操作,比如复制某个地段、对一个元素进行拖放等
Action dragAndDrop = builder.clickAndHold(someElement) .moveToElement(otherElement) .release(otherElement) .build().perform();

 

登录的简单测试:

package com.xiaoxiao.bean.xiaomenghan;

import java.util.concurrent.TimeUnit;

import org.openqa.selenium.By;
import org.openqa.selenium.WebDriver;
import org.openqa.selenium.chrome.ChromeDriver;
import org.openqa.selenium.firefox.FirefoxDriver;
import org.testng.Assert;
import org.testng.annotations.AfterTest;
import org.testng.annotations.BeforeClass;
import org.testng.annotations.DataProvider;
import org.testng.annotations.Parameters;
import org.testng.annotations.Test;

public class ALogin {
     public static WebDriver driver;
      public static String  baseURL="http://192.168.1.21:8080/sanxin.web3/a/Login.html";
    
    @Parameters("browser")
    @BeforeClass
    public void beforeTest(String browser) throws InterruptedException{
        if (browser.equalsIgnoreCase("firefox")) {
            System.setProperty("webdriver.firefox.marionette", "c:\\\\Program Files (x86)\\\\Mozilla Firefox\\\\gexkodriver.exe");
            driver=new FirefoxDriver();
            Thread.sleep(3000);
            System.out.println("成功启动了火狐浏览器");
        }else if (browser.equalsIgnoreCase("chrome")) {
            System.setProperty("webdriver.chrome.driver", "C:\\\\Program Files (x86)\\\\Google\\\\Chrome\\\\Application\\\\chromedriver.exe");
            driver=new ChromeDriver();
            Thread.sleep(3000);
            System.out.println("成功启动了谷歌浏览器"+"开始进行测试");
        }
        driver.get(baseURL);  //放在if else语句块外面更好
    }
    
    @DataProvider(name="Authentication") 
    public static Object[][] Authenticals(){
        return new Object[][]{{"139180782","12346"},{"1391807882","1234="},{"139180782","1234"},{"13918078822","123456"}}; //如何让它执行两个登陆名,就是连续登陆两次
    }
    
    @Test(dataProvider="Authentication")
    public void Login(String username,String userpassword) throws InterruptedException{
       driver.manage().timeouts().implicitlyWait(10, TimeUnit.SECONDS);
       driver.findElement(By.id("username")).sendKeys(username);   //输入框  输入用户名
       Thread.sleep(1000);
       driver.findElement(By.id("userpassword")).sendKeys(userpassword); //在输入框 输入密码
       Thread.sleep(1000);
       driver.findElement(By.id("subbtn")).click();  //点击"提交"按钮
       Thread.sleep(1000);
       
       try {
        Assert.assertEquals(driver.findElement(By.xpath(".//*[text()=\'退出\']")).getText(), "退出");
        System.out.println("测试 完美通过,成功登录到三鑫油马后台管理系统");
    } catch (Throwable e) {
        System.out.println("这是一个多么失败的测试");
    }
       Thread.sleep(1000);
    }
    
    @AfterTest
    public void afterTest(){
        driver.close();
    }
}

XML文件如下:

<?xml version="1.0" encoding="UTF-8"?>

<!DOCTYPE suite SYSTEM "http://testng.org/testng-1.0.dtd">

<!-- parallel 就是并行平行的意思,如果将其参数值 改为 tests,打开的两个浏览器同时进行 平行测试.为none就是浏览器一个一个地来-->

-<suite parallel="false" name="Suite">

<!-- 此处设置了火狐浏览器 <test name="FirefoxTest"> <parameter name="browser" value="firefox"></parameter> <parameter name="username" value="13918078822"></parameter> <parameter name="userpassword" value="123456"></parameter> <classes> <class name="com.xiaoxiao.SanXinTestNG2.TestMultiBrowser"></class> </classes> </test> -->


<!-- 此处设置了 谷歌浏览器 -->



-<test name="ChromeTest">

<parameter name="browser" value="chrome"/>

<parameter name="username" value="13918078822"/>

<parameter name="userpassword" value="123456"/>


-<classes>

<class name="com.xiaoxiao.SanXinTestNG2.TestMultiBrowser"/>

</classes>

</test>

</suite>

输入用户名和密码的过程封装起来,直接将需要输入的用户名和密码通过二维数组表示出来,便于修改,便于进行登录模块的测试。

以上是关于JUnit Test Assert的主要内容,如果未能解决你的问题,请参考以下文章

Junit4 断言新方法

使用 jUnit 测试每个开关/案例

junit4.9测试用例 spring测试用例 Assert 注解

[Java基础]Junit测试

Junit单元测试使用

Junit测试和反射