Tomcat Web JUnit Cactus JUnit Java Cactus JUnit 26.1 JUnit Java JUnit JUnit Java JSP Servlet JUnit Java Erich Gamma Kent Beck xunit JUnit boolean JUnit Java JUnit Java JUnit Java 26.1.1 JUnit JUnit How What JUnit JUnit JUnit Ant JUnit JUnit JUnit (TestCase) (TestCase) (TestSuite) (TestResult (TestListener) 363
(TestFailure) JUnit Framework AssertionFailedError JUnit Composite TestSuite Test TestSuite run() run() 26.1.2 JUnit http://prdownloads.sourceforge.net/junit/junit3.8.1.zip?download JUnit3.8.1 <JUNIT_HOME> <JUNIT_HOME> junit.jar CLASSPATH java junit.swingui.testrunner junit.samples.alltests 26.1 26.1 JUnit 26.1 JUnit 26.2 JUnit JUnit Test TestCase Assert TestSuite 364
26.2.1 Test Test Composite TestCase TestSuite TestDecorator public int counttestcases TestCase public void run TestResult TestResult run 26.2.2 TestCase TestCase Test TestCase(string name) name TestCase TestCase setup() teardown() setup() setup() teardown() // setup(); try { // runtest(); finally { // teardown(); TestCase run JUnit run TestResult 26.2.3 Assert Assert Assert AssertionFailedError JUnit Failes String AssertionFailedError JUnit 6 31 assertequals Object expcted,object actual) equals() assertsame Object expected,object actual Java == Reference asserequals(string message,string expected,string actual) ComparisonFailure 365
26.2.4 TestSuite TestSuite Cases TestSuit TestSuite Test TestSuites Test TestSuite 6 Public TestCase Public void test 26.2.5 TestResult TestResult TestResult Run() TestResult TestCase TestListener TestRunner listener starttest(test test) endtest(test test) adderror(test test,throwable t) addfailure(test test,assertionfailederror t) TestFailure tostring() 26.3 JUnit JUnit junit.framework.testcase test case public void testxxxxx() test case test junit test runner test case JUnit 2 test runner java junit.swingui.testrunner XXXXX java junit.textui.testrunner XXXXX XXXXX 26.3.1 1. getter setter package cn.ac.ict; 366
public class Account { private String username; private float rmb; public Account(String name,float money){ this.username = name; this.rmb = money; // username public void setusername(string name){ this.username = name; public String getusername(){ return this.username; // rmb public void setrmb(float money){ this.rmb = money; public float getrmb(){ return this.rmb; // Account public boolean Operate(Account acc){ if(username.equals(acc.getusername())){ if(this.rmb>acc.getrmb()){ rmb-=acc.getrmb(); else{ return false; else if(!username.equals(acc.getusername())){ rmb+=acc.getrmb(); return true; // Account public boolean equals(object obj1,object obj2){ if((obj1 instanceof Account)&&(obj2 instanceof Account)){ Account acc1 = (Account)obj1; Account acc2 = (Account)obj2; return (rmb==(acc1.getrmb()+acc2.getrmb())); return false; 2. TestCase testxxxx() 367
XXXX AccountTest package cn.ac.ict; import junit.framework.assert; import junit.framework.testcase; public class AccountTest extends TestCase { Account acc1 ; Account acc2 ; // protected void setup() throws Exception { super.setup(); acc1 = new Account("zhw",25663.7F); acc2 = new Account("rambler",2563.7F); // protected void teardown() throws Exception { super.teardown(); // Operate public void testoperate() { Account expected = new Account("all",28227.4F); Account temp = new Account("rambler",325.4F); acc1.operate(temp); acc2.operate(temp); Assert.assertTrue(expected.equals(acc1,acc2)); // equals public void testequalsobjectobject() { Assert.assertTrue(!acc1.equals(null,null)); Assert.assertTrue(acc1.equals(acc1,new Account("zero",0.0F))); Assert.assertTrue(!acc1.equals(acc1,acc2)); setup teardown junit framework setup teardown -> setup -> testxxxx -> teardown -> AccountTest.java junit.jar java junit.awtui.testrunner cn.ac.ict.accounttest 26.2 java junit.textui.testrunner cn.ac.ict.accounttest java junit.swingui.testrunner cn.ac.ict.accounttest 368
26.2 26.3.2 TestSuite TestSuite TestCase testxxx() TestSuite TestCase testxxx () TestSuite package cn.ac.ict; import junit.framework.test; import junit.framework.testsuite; public class AccountTests { public static void main(string[] args) { junit.swingui.testrunner.run(accounttests.class); public static Test suite() { TestSuite suite = new TestSuite("Test for cn.ac.ict"); //$JUnit- $ suite.addtestsuite(accounttest.class); //$JUnit- $ return suite; TestCase TestSuite TestCase TestCase TestSuite TestSuite java cn.ac.ict.accounttests 369
java junit.swingui.testrunner cn.ac.ict.accounttests 26.3 26.4 Cactus Web 26.3 Cactus JUnit Java Cactus Servlet Java HttpServletRequest HttpServletResponse HttpSession Cactus JspTestCase ServletTestCase FilterTestCase Cactus 26.4 26.4 Cactus JUnit Test Runner YYYTestCase.runTest() beginxxx(servlettestrequest ) YYYTestCase.runTest() Redirector Proxy HTTP 370
Redirector Proxy Test class Server HttpServletRequest ServletConfig ServletContext Cactus wrapper HTTP Session Redirector Proxy Reflection Test setup() testxxx() teardown() testxxx() Server side classes JUnit assert API testxxx() Redirector Proxy Redirector Proxy JUnit YYYTestCase.runTest() endxxx(httpurlconnection) JUnit asserts HTTP Header servlet output stream Tomcat Cactus Servlet 26.4.2 Cactus Cactus Apache Cactus Web Cactus JAR Cactus http://jakarta.apache.org/cactus/ 1.7.1 jakarta-cactus-12-1.7.1.zip lib Web /WEB-INFO/lib 26.4.2 Cactus Servlet Servlet Servlet JSP 1. Servlet Servlet package cn.ac.ict; import javax.servlet.http.*; public class LoginServlet extends HttpServlet { public boolean isvaliduser(httpservletrequest request) { String username = request.getparameter("username"); String password = request.getparameter("password"); if(username == null password == null!username.equals("justin")!password.equals("123456")) { return false; else { return true; Servlet 2. Servlet 371
Cactus JUnit Servlet TestCase ServletTestCase Servlet LoginServletTest.java package cn.ac.ict.test; import org.apache.cactus.servlettestcase; import org.apache.cactus.webrequest; import cn.ac.ict.loginservlet; public class LoginServletTest extends ServletTestCase { // public void beginvaliduser(webrequest webrequest) { webrequest.addparameter("username", "justin"); webrequest.addparameter("password", "123456"); // public void testvaliduser() { LoginServlet loginservlet = new LoginServlet(); asserttrue(loginservlet.isvaliduser(request)); // public void begininvaliduser(webrequest webrequest) { webrequest.addparameter("username", "guest"); webrequest.addparameter("password", "123456"); // public void testinvaliduser() { LoginServlet loginservlet = new LoginServlet(); assertfalse(loginservlet.isvaliduser(request)); TestRunner beginxxx() WebRequest WebRequest HTTP testxxx() beginxxx() testxxx() testxxx() request Container ServletTestRedirector request 3. Redirector Proxy TestRunner ServletTestRedirector Redirector Proxy Cactus ServletTestRunner TestRunner Web web.xml Servlet web.xml <servlet> <servlet-name>servletredirector</servlet-name> <servlet-class>org.apache.cactus.server.servlettestredirector</servlet-c lass> </servlet> <servlet-mapping> <servlet-name>servletredirector</servlet-name> 372
<url-pattern>/servletredirector</url-pattern> </servlet-mapping> <servlet> <servlet-name>servlettestrunner</servlet-name> <servlet-class>org.apache.cactus.server.runner.servlettestrunner</servle t-class> </servlet> <servlet-mapping> <servlet-name>servlettestrunner</servlet-name> <url-pattern>/servlettestrunner</url-pattern> </servlet-mapping> 4. Servlet Cactus Web 26.5 26.5 Servlet Tomcat http://localhost:8080/cactusunit/servlettestrunner?suite=cn.ac.ict.test. LoginServletTest 26.6 373
26.6 Servlet XML Suite cn.ac.ict.test.loginservlettest 26.5 1. software entropy 2. bug 3. 1 2 3 TestCase 4. UML CRC 374
1 2 3 5. bug 26.6 JUnit Java Servlet JSP Cactus JUnit Java JUnit JUnit JUnit Cactus Cactus JUnit TestCase Suite 375