??xml version="1.0" encoding="utf-8" standalone="yes"?>亚洲激情在线视频,久久国产88,日本道免费精品一区二区三区http://www.aygfsteel.com/zzzlyr/articles/432653.html张钊?/dc:creator>张钊?/author>Mon, 10 Jul 2017 02:17:00 GMThttp://www.aygfsteel.com/zzzlyr/articles/432653.htmlhttp://www.aygfsteel.com/zzzlyr/comments/432653.htmlhttp://www.aygfsteel.com/zzzlyr/articles/432653.html#Feedback0http://www.aygfsteel.com/zzzlyr/comments/commentRss/432653.htmlhttp://www.aygfsteel.com/zzzlyr/services/trackbacks/432653.html前言QJUnit元数?/strong>

@BeforeQ?nbsp;
使用了该元数据的Ҏ在每?a title="软g试知识? target="_blank" style="color: #df3434; text-decoration-line: none; font-weight: bold;">试Ҏ执行之前都要执行一ơ?nbsp;
@AfterQ?nbsp;
使用了该元数据的Ҏ在每个测试方法执行之后要执行一ơ?nbsp;
注意Q@Before和@After标示的方法只能各有一个。这个相当于取代了JUnit以前版本中的setUp和tearDownҎQ当然你q可以l叫q个名字Q不qJUnit不会霔R的要求你q么做了?br /> @Test(expected=*.class) 
在JUnit4.0之前Q对错误的测试,我们只能通过fail来生一个错误,q在try块里面assertTrueQtrueQ来试。现在,通过@Test元数据中的expected属性。expected属性的值是一个异常的cd
@Test(timeout=xxx): 
该元数据传入了一个时_毫秒Q给试ҎQ?nbsp;
如果试Ҏ在制定的旉之内没有q行完,则测试也p|?nbsp;
@ignoreQ?nbsp;
该元数据标记的测试方法在试中会被忽略。当试的方法还没有实现Q或者测试的Ҏ已经q时Q或者在某种条g下才能测试该ҎQ比如需要一?a title="MySQL知识? target="_blank" style="color: #df3434; text-decoration-line: none; font-weight: bold;">数据?/a>联接Q而在本地试的时候,数据库ƈ没有q接Q,那么使用该标{来标示q个Ҏ。同Ӟ你可以ؓ该标{传递一个String的参敎ͼ来表明ؓ什么会忽略q个试?法。比如:@lgnore(“该方法还没有实现”)Q在执行的时候,仅会报告该方法没有实玎ͼ而不会运行测试方法。?/p>

一、包含必要地Package

最主要C?Package是org.junit.*Q把它包含进来之后,l大部分功能有了。还有一句话也非常地重要“import static org.junit.Assert.*;”Q我们在试的时候用的一pdassertEqualsҎ来自这个包。大家注意一下,q是一个静态包?(static)Q是JDK5中新增添的一个功能。也是_assertEquals是AssertcM的一pd的静态方?/p>

二、测试类的声?/strong>

试cL一个独立的c,没有M父类。测试类的名字也可以L命名Q没有Q何局限性。它与普通类的区别在于它内部的方法的声明

三、创Z个待试的对?/strong>

你要试哪个c,那么你首先就要创Z个该cȝ对象?/p>

private staticCalculator calculator =newCalculator();

Z试Calculatorc,我们必须创徏一个calculator对象?/p>

四、测试方法的声明

在测试类中,q不是每一个方法都是用于测试的Q你必须使用“标注”来明表明哪些是试Ҏ?#8220;标注”也是JDK5的一个新Ҏ,用在此处非常恰当。我们可以看刎ͼ在某些方法的前有@Before、@Test、@Ignore{字Pq些是标注Q以一?#8220;@”作ؓ开头。这些标注都是JUnit4自定?的,熟练掌握q些标注的含义非帔R要?/p>

六?忽略试某些未完成的方?/strong>

七?Fixture(暂且译?#8220;固定代码D?#8221;)

Fixture 的含义就?#8220;在某些阶D必然被调用的代?#8221;?#8220;在Q何一个测试执行之前必L行的代码”是一个FixtureQ我们用@Before来标注它

一?高Fixture

两个Fixture标注Q分别是@Before和@AfterQ是否适合完成如下功能Q有一个类是负责对大文?过 500?q行dQ他的每一个方法都是对文gq行操作。换句话_在调用每一个方法之前,我们都要打开一个大文gq读入文件内容,q绝Ҏ一个非常耗费旉的操作。如果我们用@Before和@AfterQ那么每ơ测试都要读取一ơ文Ӟ效率及其低下。这里我们所希望的是在所有测试一开始读一ơ文Ӟ 所有测试结束之后释放文Ӟ而不是每ơ测试都L件。JUnit的作者显然也考虑Cq个问题Q它l出了@BeforeClass ?@AfterClass两个Fixture来帮我们实现q个功能。从名字上就可以看出Q用q两个Fixture标注的函敎ͼ只在试用例初始化时执行@BeforeClassҎQ当所有测试执行完毕之后,执行@AfterClassq行收尾工作。在q里要注意一下,每个试cd能有一个方法被标注?@BeforeClass或@AfterClassQƈ且该Ҏ必须是Public和Static的?/p>

二?限时试

那个求^Ҏ的函数有BugQ是个死循环Q?/p>

  public voidsquareRoot(intn) ...{

         for(; ;) ;//Bug : d@?/p>

  }

如果试的时候遇到死循环Q对于那些逻辑很复杂,循环嵌套比较qE序Q很有可能出现死循环Q因此一定要采取一些预防措施。我们给q些试函数讑֮一个执行时_过了这个时_他们׃被系l强行终止,q且pȝq会向你汇报该函数结束的原因是因Ӟq样你就可以发现q些Bug了。只需要给@Test标注加一个参数即可,代码如下Q?/p>

  @Test(timeout = 1000)

  public voidsquareRoot() ...{

         calculator.squareRoot(4);

         assertEquals(2,calculator.getResult());

  }

  Timeout参数表明了你要设定的旉Q单位ؓ毫秒Q因?000׃?U?/p>

三?试异常

l常会编写一些需要抛出异常的函数Q如果一个函数应该抛出异常,但是它没抛出Q当然是Bug。例如,我们写的计算器类有除法功能,如果除数是一?Q那么必然要抛出“?异常”。因此,我们很有必要对这些进行测试。代码如下:

  @Test(expected = ArithmeticException.class)

  public void divideByZero() ...{

         calculator.divide(0);

  }

如上qC码所C,我们需要用@Test标注的expected属性,我们要验的异常传递给他,q样JUnit框架p自动帮我们检是否抛Z我们指定的异常?/p>

四?Runner (q行?

把测试代码提交给JUnit框架后,框架如何来运行代码呢?{案是——Runner。在JUnit中有很多?RunnerQ他们负责调用测试代码,每一个Runner都有各自的特D功能,要根据需要选择不同的Runner来运行测试代码。JUnit中有一个默认RunnerQ如果没有指定,那么pȝ自动使用默认 Runner来运行你的代码。换句话_下面两段代码含义是完全一LQ?/p>

import org.junit.runner.RunWith;

import org.junit.runners.Suite;

 

@RunWith(Suite.class)

@Suite.SuiteClasses({

MyTestCase.class, //试c?/p>

PartSuite.class, //另一个测试套

})

public class AllTestCases {

}

  要想指定一个RunnerQ需要用@RunWith标注Qƈ且把你所指定的Runner作ؓ参数传递给它。另外一个要注意?是,@RunWith是用来修饰类的,而不是用来修饰函数的。只要对一个类指定了RunnerQ那么这个类中的所有函数都被这个Runner来调用?/p>

五?参数化测?/strong>

一个对考试分数q行评h的函敎ͼq回值分别ؓ“优秀Q良好,一般,及格Q不及格”Q因此你在编写测试的时候,臛_要写5个测试,把这5中情况都包含了,q?实是一件很ȝ的事情。我们还使用我们先前的例子,试一?#8220;计算一个数的^?#8221;q个函数Q暂且分三类Q正数?、负数。测试代码如下:

importorg.junit.AfterClass;

  importorg.junit.Before;

  importorg.junit.BeforeClass;

  importorg.junit.Test;

  importstatic org.junit.Assert.*;

  public classAdvancedTest ...{

         private static Calculator calculator =new Calculator();

         @Before

         public void clearCalculator() ...{

                calculator.clear();

         }

         @Test

         public void square1() ...{

                calculator.square(2);

                assertEquals(4,calculator.getResult());

         }

         @Test

         public void square2() ...{

         calculator.square(0);

         assertEquals(0, calculator.getResult());

         }

         @Test

         public void square3() ...{

                calculator.square(-3);

                assertEquals(9,calculator.getResult());

         }

}

Z化类似的试QJUnit4提出?#8220;参数化测?#8221;的概念,只写一个测试函敎ͼ把这若干U情况作为参C递进去,一ơ性的完成试。代码如下:

  importstatic org.junit.Assert.assertEquals;

  importorg.junit.Test;

  importorg.junit.runner.RunWith;

  importorg.junit.runners.Parameterized;

  importorg.junit.runners.Parameterized.Parameters;

  importjava.util.Arrays;

  importjava.util.Collection;

  @RunWith(Parameterized.class)

  public classSquareTest{

  private static Calculator calculator = new Calculator();

         private int param;

         private int result;

         @Parameters

         public static Collection data(){

                return Arrays.asList(newObject[][]...{

                {2, 4},

                {0, 0},

                {-3, 9},

         });

  }

//构造函敎ͼ对变量进行初始化

六、断a和假?/strong>

断言Qorg.junit.Assert用于试用例中,如果断言p|Q用例即l束?/p>

假设Qorg.junit.Assume用于在准备环境时判断环境是否W合要求Q包括测试套的@BeforeClassQ测试类的@BeforeClass,试cȝ实例化,试cȝ@Before?/p>

如果假设p|Q假设所处初始化代码Ҏ立即l束Q更q别的后箋工作也被忽略Q相x试用例被忽略Q但与假讑֐U别的收ַ作还要l执行?nbsp;
例如Q如果在试cȝ@BeforeClass中假讑֤败,该类的实例化及子U别被忽略Q@AfterClass会l执行?br /> 七、工E实?br />       如果不想在单元测试中操作数据库中的数据。可以在试Ҏ上加 
     @Test

    @Transactional //单元试  @Transactional 不会q行数据提交事物
    @Rollback(true) // q个注释可以不用加(单元试默认|
    public void testaddUserPrivate()throws Exception{
        UserPrivate userPrivate=new UserPrivate();
        userPrivate.setTenantId("31");
        userPrivate.setMenuCode("7777888");
        userPrivate.setpUid("111222");
        userPrivate.setRoleId("3332277");
        userPrivate.setValue("99999");
        userPrivate.setUpdateDateTime(new Date());
        userPrivate.setCreateDateTime(new Date());
        int s=userPrivateService.addUserPrivate(userPrivate);
        Assert.assertEquals(1, s); // q是断言的?/div>
    }
        


]]> վ֩ģ壺 ̨| | »| ͳ| ˫| | ˮ| ɫ| ī| ͩ| | ¡| | | ʳ| ͷ| | | | | ˷| ֶ| | ֽ| ɳ| ԭ| Ϫ| | Դ| | | | ̺| ˳| | | Ͽ| ֹ| ˶| ɽ| |