java 测试概述

来源:互联网 发布:淘宝永恒强袭自由高达 编辑:程序博客网 时间:2024/06/06 08:02

1. 概述

测试分为黑盒测试和白盒测试,也就是源代码测试和功能测试。

其中单元测试是白盒测试的典型,静态代码检查和代码覆盖率检查协助白盒测试发现源代码问题。

而黑盒测试是作为用户对系统的功能进行的测试,是对白盒测试一个补充。httpUnitspring mvc控制器的测试单个功能的测试,对业务、流程和性能测试比较弱,qtp专注业务和流程测试,loadrunner专注业务性能测试。

2. 单元测试

2.1. *junit

2.1.1. 注解

@BeforeClass:方法必须是静态的公共方法,最先执行

@Before:方法必须是实例的公共方法,其次执行

@Test:测试的主体

@After:方法必须是实例的公共方法,在测试完成后执行

@AfterClass:方法必须是静态的公共方法,最后执行

 

2.1.2. @Test说明

@Test同样也可以测试异常以及运行时间

抛出异常测试的格式为:@Test(expected=XXXXXException.class)

时效测试的格式为:@Test(timeout=XXXX,单位为毫秒

2.1.3. 组合测试

组合测试就是使用Suit的实现类把多个类组合执行,而junit在默认的情况下是BlockJUnit4ClassRunner,无法把多个类组合执行。

具体方法是在类上注解@RunWith(Suit.class),然后在其下面使用@SuitClasses({AAAA.class,BBBB.class});

2.1.4. 并发测试

并发测试就是可以把多个类或者一个类并发执行。

@Test

public void test(){

Class[] cls = new Class[]{AAA.class,BBB.class,XXXX.class};

JUnitCore.runClasses(ParallelComputer.classes(), cls);  

}

若是clas中是一个类的多个实例数组,则实现了一个类的并发测试,有多少个实例,其并发数就是多少个。

2.1.5. 参数化测试

使用不同的参数来测试不同的场景,先有构造参数把把参数与期望值的多组放到集合中,参数化的测试的构造函数接收参数和期望值作为参数,通过测试类把参数测试后的值与预期值比较。

事例如下:

@RunWith(Parameterized.class)

public class TestParam {

@SuppressWarnings("rawtypes")

@Parameters

public static Collection getParams(){

return Arrays.asList(new Object[][]{{1,10},{2,20}});

}

int paramexpect;

public TestParam(int param,int expect){

this.param = param;

this.expect = expect;

}

@Test

public void test(){

Assert.assertEquals(expect, (int)param*10);

}

}

 

2.1.6. 推测参数测试

推测参数测试和参数化测试很相似,但是推测测试不需要参数形式的类构造函数。

@RunWith必须要是Theories.class,并且需要把输入的参数和期望的值必须注解为@DataPoints或者@DataPointDataPoint是单个参数,而DataPoints是参数集合。

测试函数必须要注解为@Theory,并且把要输入的参数在此函数的参数列表中写出来

@RunWith(Theories.class)

public class TestTheories {

@DataPoints

public static int[] params=new int[]{1,2,3};

@DataPoints

public static int[] params1=new int[]{-11,-12,-13};

@Theory

public void test(int param){

Assert.assertTrue(param<4);

}

}

2.2. *EasyMock

屏蔽依赖的外部接口影响,专注于当前类的测试。

2.2.1. 用处

1)并发开发:在开发中,我们需要依赖其他人的接口,在对方没有实现或者没有实现稳定的版本情况下,使用mock在很短的时间内做一个虚拟实现,减少并发等待时间

2)独立环境测试:有些模块需要比较复杂的启动环境,而mock的虚拟实现就可以屏蔽模块启动复杂性

2.2.2. 示例

public class TestMock {

@Test

public void test(){

//创建虚拟对象

ITestMock tm=EasyMock.createMock(ITestMock.class);

Packets packets = new Packets();

//设定虚拟对象的行为:方法、返回值以及耗时

EasyMock.expect(tm.print(packets)).andReturn("a").times(1);

 //把此对象设定为响应方式,也就是开始服务模式

 EasyMock.replay(tm);

 Assert.assertEquals("a", tm.print(packets));

}

}

3. 功能测试

3.1. httpunit

3.1.1. 页面测试

页面测试时模拟浏览器的行为进行测试,响应返回页面请求。这个方式模拟单个页面比较的容易,但是模拟整个的页面流程就比较复杂,这个情况使用loadRunner更方便。

3.1.1.1. GET方式

@Test

public void testFetchGetById() throws Exception {

String url = "http://localhost:8080/DataCenter/packets/query/id/sdfdsf";

WebConversation webConversation = new WebConversation();

WebRequest request = new GetMethodWebRequest(url);

WebResponse response = webConversation.getResponse(request);

String json = response.getText();

Assert.assertTrue(json,json.contains("结果为空"));

}

3.1.1.2. POST方式

@Test

public void testFetchPostById() throws Exception {

String url = "http://localhost:8080/DataCenter/packets/query/id/sdfdsf";

WebConversation webConversation = new WebConversation();

PostMethodWebRequest request = new PostMethodWebRequest(url);

request.setParameter("aaParam""aaValue");

WebResponse response = webConversation.getResponse(request);

String json = response.getText();

Assert.assertTrue(json,json.contains("结果为空"));

}

3.1.2. *servlet测试

public class TestHelloServlet {

@Test

public void testServlet()throws Exception{

  //创建Servlet的运行环境  

        ServletRunner sr = new ServletRunner(); 

        //向环境中注册Servlet  

        sr.registerServlet( "HelloServlet", HelloServlet.class.getName() );   

        //创建访问Servlet的客户端  

        ServletUnitClient sc = sr.newClient();   

        //发送请求  

        WebRequest request = new GetMethodWebRequest( "http://localhost/HelloServlet" );   

        //获得模拟服务器的信息  

        WebResponse response = sc.getResponse( request );

        String text =  response.getText().trim();

        Assert.assertEquals("Hello World!",text);

}

}

3.2. *spring mvc控制器测试

3.2.1. 独立测试

public class TestHelloController1 {

    private MockMvc mockMvc;  

    /**

     * 构建HelloController的web容器mockMvc

     */

    @Before

    public void init(){

    this.mockMvc = MockMvcBuilders.standaloneSetup(new HelloController()).build();  

    }

    @Test

    public void test()throws Exception{

    String name = "myName";

    MvcResult mr = mockMvc.perform(get("/hello/"+name)).andExpect(status().isOk()).andReturn();

    String text = mr.getResponse().getContentAsString().trim();

    Assert.assertEquals("Hello "+name, text);

    }

}

3.2.2. 集成web环境测试

@RunWith(SpringJUnit4ClassRunner.class)  

@WebAppConfiguration  

@ContextConfiguration(locations = { "classpath:applicationContext.xml" })  

public class TestHelloController {

 @Autowired  

    private WebApplicationContext wac;

    private MockMvc mockMvc;

    /**

     * 构建springmvc的web容器mockMvc

     */

    @Before

    public void init(){

    this.mockMvc = webAppContextSetup(this.wac).build();  

    }

    @Test

    public void test()throws Exception{

    String name = "myName";

    MvcResult mr = mockMvc.perform(get("/hello/"+name)).andExpect(status().isOk()).andReturn();

    String text = mr.getResponse().getContentAsString().trim();

    Assert.assertEquals("Hello "+name, text);

    }

}

3.3. qtp

QTPquicktest Professional的简称,是一种自动测试工具。使用QTP的目的是想用它来执行重复的自动化测试,主要是用于回归测试和测试同一软件的新版本。因此你在测试前要考虑好如何对应用程序进行测试,例如要测试哪些功能、操作步骤、输入数据和期望的输出数据等。

3.4. loadrunner

LoadRunner,是一种预测系统行为和性能的负载测试工具。通过以模拟上千万用户实施并发负载及实时性能监测的方式来确认和查找问题,LoadRunner能够对整个企业架构进行测试。企业使用LoadRunner能最大限度地缩短测试时间,优化性能和加速应用系统的发布周期。 LoadRunner可适用于各种体系架构的自动负载测试,能预测系统行为并评估系统性能。

 

4. 静态代码检查

4.1. *findbugs

1)建立Maven Build运行方式,在运行的命令中输入findbugs:fingbugs

 

2)findBugs运行的结果放到target中的fingbugsXml.xml文件中

 

 

4.2. pmd

1) 下载pmd eclipse插件,解压插件,复制pluginsfeatures目录下的文件到eclise下的pluginsfeatures

2) 打开eclipsewindows->Preferences,找到pmd选项

3) 选择pmd选项下的Rules Configuration选项,清除所有的规则,然后重新导入规则文件springside3_ruleset.xml

 

 

4) 源代码目录右键选择pmd->Check Code With PMD,查看Violations Overview中的error错误。

 

 

5) 矫正其中的错误项

5. 代码覆盖率

5.1. *emma

1)建立Maven Build运行方式,在运行的命令中输入emma:emma

 

 

2)运行Run,开始进行单元测试,测试后出现一个测试报告

 

 

5.2. cobertura

5.2.1. 配置

pom.xml文件中添加如下配置:

 <reporting>

  <outputDirectory>target/mojo</outputDirectory>

  <plugins>

  <plugin>

     <groupId>org.codehaus.mojo</groupId>

  <artifactId>cobertura-maven-plugin</artifactId>

  <version>2.7</version>

  </plugin>

  </plugins>  

  </reporting>

 

5.2.2. 运行

1)建立Maven Build运行方式,在运行的命令中输入cobertura:cobertura

 

3)运行Run,开始进行单元测试,测试后出现一个测试报告

 

报告入口index.html结果如下

 

类详情结果如下


0 0
原创粉丝点击