JUNIT测试

Posted

tags:

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

package com.practice.user;

import java.util.List;

import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

import org.apache.struts.action.Action;
import org.apache.struts.action.ActionForm;
import org.apache.struts.action.ActionForward;
import org.apache.struts.action.ActionMapping;
import org.apache.struts.action.ActionMessage;
import org.apache.struts.action.ActionMessages;
import org.apache.struts.action.DynaActionForm;

import com.practice.user.Check;
import com.practice.user.ReadFile;

public class RegisterAction extends Action
public ActionForward execute(ActionMapping mapping,ActionForm form,
HttpServletRequest request,HttpServletResponse response)throws Exception

DynaActionForm RegisterForm=(DynaActionForm)form;
String username=(String)RegisterForm.get("username");
System.out.println(username);
String password=(String)RegisterForm.get("password");
String passwords=(String)RegisterForm.get("passwords");
String gender=(String)RegisterForm.get("gender");
String birthday=(String)RegisterForm.get("birthday");
String address=(String)RegisterForm.get("address");
String telephone=(String)RegisterForm.get("telephone");
String email=(String)RegisterForm.get("email");
String PageForward=null;
List allUserList=ReadFile.readAllUser();
System.out.println(allUserList);

if(!Check.check(username, allUserList))
String newUserValue=username+" ¦"+password+" ¦"+gender+" ¦"+birthday+" ¦"
+address+" ¦"+telephone+" ¦"+email;
WriteFile.write(newUserValue);
PageForward="registersuccess";

else

ActionMessages errors = new ActionMessages();
errors.add(ActionMessages.GLOBAL_MESSAGE,
new ActionMessage("usernamere"));
if (!errors.isEmpty())
saveErrors(request, errors);

PageForward="error";

return mapping.findForward(PageForward);



都需要测什么啊 怎么写它的测试类

对于 Struts 1.x的测试起来是比较麻烦,单纯的用junit测试框架是无法对他进行测试的,因为他Struts1.x的Action 依赖于特定的环境。

楼主请看:public ActionForward execute(ActionMapping mapping,ActionForm form,
HttpServletRequest request,HttpServletResponse response)throws Exception
这个 方法里面的request,response 都是依赖于一个web容器的如tomcat,resin等等
所以 你用单纯的junit是无法 测试他的,因为你很难(不是不可以) 去模拟request和response.

幸好对于 Struts1.x,有了专门针对它的测试框架StrutsTestCase

下载地址: http://sourceforge.net/projects/strutstestcase/

———————————————————————————————
StrutsTestCase for JUnit是Junit TestCase类的扩展,提供基于Struts框架的代码测试装置。StrutsTestCase同时提供Mock 对象方法和Cactus方法用来实际运行Struts ActionServlet,你既可以通过运行servlet引擎来测试,也可以不通过它。因为StrutsTestCase使用ActionServlet控制器来测试你的代码,因此你不仅可以测试Action对象的实现,而且可以测试mappings,from beans以及forwards声明。

下面是它的使用方法:

首先应从StrutsTestCase主页下载该工具,解压后会有一个JAR文件,还有一个例子以及API DOC。编写StrutsTestCase时需将这个JAR文件引入到工程中(和Struts中的JAR文件放在一起),此外由于是对JUnit的扩展,因此还必须将Junit.jar引入到工程中。

上面已经介绍过有两种测试方法,下面分别来简单说明:

1) MockStrutsTestCase(Mock对象测试):通过模拟容器来进行测试。MockStrutsTestCase用一套HttpServlet mock对象在不需要运行Servlet引擎的情况下来模拟容器环境。

2) CactusStrutsTestCase(In-container testing):在真实运行的容器中通过使用Cactus测试框架进行测试。

说明:上述两个类都是对Junit TestCase的扩展。如果要将Mock对象测试方法改为Cactus方法,只需要将我们所定义子类的父类由MockStrutsTestCase改为CactusStrutsTestCase即可,而不需要更改内部代码。

命名规则:对于类的命名没有严格的规范,但个人建议使用Test+要测试的Action名;方法名可以任意取,但注意一点:系统只会自动运行以”test”开头的方法名来进行测试。

下面通过一个我写的一个实例来说明具体使用方法,先来看一个Action(RegisterAction.java)中的代码:

package com.firefly;
import org.apache.struts.action.*;
import javax.servlet.http.*;
/**
* @author firefly
*/

public class RegisterAction extends Action

public ActionForward execute(ActionMapping mapping,ActionForm form,

HttpServletRequest req, HttpServletResponse res)

RegisterForm rf = (RegisterForm)form;

//String userName = rf.getUserName();

String password1 = rf.getPassword1();

String password2 = rf.getPassword2();

if(password1.equals(password2))

try

return mapping.findForward("success");



catch(Exception e)

return mapping.findForward("failure");





return mapping.findForward("failure");





功能很简单,即查看两次输入的密码是否相同,相同则转到success,否则转到failure。下面是测试代码(TestRegisterAction.java):

package com.firefly;
import servletunit.struts.*;
/**
* @author firefly
*/

public class TestRegisterAction extends MockStrutsTestCase

public void setUp() throws Exception

super.setUp();



public void tearDown() throws Exception

super.tearDown();



public TestRegisterAction(String testName)

super(testName);



public void testSuccessfulLogin()

setRequestPathInfo("/register");

addRequestParameter("userName","hellking");

addRequestParameter("password1","123");

addRequestParameter("password2","123");

actionPerform();

verifyForward("success");



public void testFailedLogin()

setRequestPathInfo("/register");

addRequestParameter("userName","hellking");

addRequestParameter("password1","123");

addRequestParameter("password2","");

actionPerform();

verifyForward("failure");


说明:

1) 如果override了setUp()和tearDown()方法,那么必须在第一行显示调用其父类的相应方法,原因很简单,父类在这两个方法中定义了很多内容来保证程序能够按照既定规则执行,所以我们必须加载它。

2) 在测试方法中,我们需要做的第一件事是通知Struts在这个测试中要使用哪一个映射(mapping),我们指定一个和Struts mapping相关联的路径,这与Struts标签库方法中使用的机制相同。

3) 我们接下来要做的是通过request对象传递form bean属性,这同样与Struts所做的相同。

4) 该到运行action的时候了,我们通过使用actionPerform()方法来完成该任务。

5) 最后要检验的是程序运行结果是否和我们所预期的一样,通过调用verifyForward()方法来进行确认。这里还有可能用到其他一些方法,如:assertEquals(),assertNull(),verifyNoActionErrors(),verifyActionErrors()等等。

6) 即使你在test方法中不进行任何测试,系统也不会提示任何错误(这个与Action中execute()方法必须返回ActionMapping有所不同),显示的测试结果仍然为成功。你可以在一个test方法中写多个测试,但个人不建议这样使用,这会给方法的命名及程序的结构带来很大的困扰。此外,test方法中遇到测试失败后便会立即返回,而不是继续向下运行(这和and语句颇有相似之处)。

7) 主要函数和作用:

setRequestPathInfo,设置request的请求

addRequestParameter,将参数和对应的值加入request中

actionPerform,执行这个请求

verifyForward,验证forward的名字是否正确

verifyForwardPath,验证forward的path是否正确

verifyNoActionErrors,验证在action执行过程中没有ActionError产生

verifyActionErrors,验证在action执行过程中产生的ActionError集合的内容

详细请查看API DOC。

使用StrutsTestCase不启动servlet容器来测试struts应用程序(容器外测试)也属于Mock对象测试,但是与EasyMock不同的是,EasyMock是提供了创建Mock对象的API,而StrutsTest则是专门负责测试Struts应用程序的Mock对象测试框架。

除了容器外测试,StrutsTest也可以很方便的用容器内的测试。
参考技术A junit测试一般测试底层类的实现方法的,

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

为什么使用Junit单元测试?Junit的详解

为什么使用Junit单元测试?Junit的详解

从另一个 JUnit 测试类运行 JUnit 测试类

[JUnit] JUnit5 基础 4 - Maven 集成,参数化测试,重复测试 [完]

JUnit单元测试

junit是啥?