zoukankan      html  css  js  c++  java
  • UnitTest

    1.使用Junit的最佳实践:

    ①新建一个名为test的source folder, 用于存放测试类源代码.

    ②目标类与测试类应该位于同一个包下面, 这样测试类中就不必导入源代码所在的包, 因为他们位于同一包下面

    ③测试类的命名规则:假如目标类的是Calculator,那么测试类应该命名为TestCalculator或者是CalculatorTest

    2.Junit的口号是: keep the bar green to keep the code clean.

    3.Junit:单元测试不是为了证明您是对的, 而是为了证明你没有错误.

    4.测试用例(Test Case)是单元测试的一个很重要的方面.

    5.单元测试主要是用来判断程序的执行结果与自己期望的结果是否一致.

    6.测试类必须要继承与TestCase父类:

    7.在Junit3.8中,测试犯法需要满足如下原则:

    ①public

    ②void的

    ③无方法参数

    ④方法名称必须以test开头.

    8.Test Case之间一定要完全的独立性, 不允许出现任何的依赖关系.

    9.我们不能依赖于测试方法的执行顺序.

    10.DRY(Don't Repeat Yourself):

    11.关于setUp与tearDown方法的执行顺序:

    ①setUp

    ②testAdd

    ③tearDown

    12.测试类的私有方法有时,可以采取两种方法:

    ①修改方法的访问修饰符, 将private修改为default或public(但不推荐采取这种方法.)

    ②使用反射在测试类中调用目标类的私有方法(推荐)

    13. TestSuite(测试套件): 可以将多个测试组合在一起,同时进行多个测试.

    14.RepeatedTest():重复执行测试, 注意重复的是测试方法而不是测试类.

    15. JUnit4全面引入了annotation来执行我们编写的测试.

    16.JUnit4不要求测试类必须继承TestCase父类:

    17.虽然JUnit4并不要求测试方法名以test开头, 但我们最好还是按照JUnit3.8的要求那样, 以test作为测试方法的名开头.

    18. 在JUint4中 通过 @Befor修饰的方法 对应于3.8中setUp( )方法

    19. 在JUnit4中, @After 修饰的方法相当于3.8中 tearDown( )方法.

    20. 在JUnit4中, @BeforeClass修饰静态方法, 在所有的方法执行之前执行, 可以进行一些代价较高的初始化工作.

    21.在JUnit4中, @AfterClass修饰静态方法, 在所有方法执行之后执行.所有@AfterClass修饰的方法理所当然的执行,即使BeforeClass 方法抛出了异常. superclass的@AfterClass会在当前类后执行.

    22.在JUnit4中, 可以使用@BeforeClass与@AfterClass注解修饰一个public static void no-arg的方法, 这样被@Before注解所修饰的方法会在所有测试方法执行之前执行, 被@AfterClass注解所修饰的方法会在所有测试方法执行之后执行.

    23. JUnit4中, @Ignore:既可以用在测试方法上面也可以用在测试类上面, 当修饰测试类时,表示忽略掉类中的所有测试方法; 当修饰测试方法时, 表示忽略掉该测试方法.其具有一个可选值.

    24.JUnit4的新功能:参数化测试:当一个测试类使用参数化运行器运行时,需要在类的声明除加上@RunWith(Parameterized.class)注解, 表示该类将不使用JUnit内建的运行器运行, 而使用参数化运行器运行,参数化运行器提供参数的方法上要是用@Parameters注解来修饰, 同时在测试类的构造方法中为各个参数赋值(构造方法是由JUint调用的), 最有编写测试类, 它会根据参数的组数来运行测试多次.

    25. 在JUnit4中, 如果想要同时运行多个测试, 需要使用两个注解: @RunWith(Suite.class)以及@Suite.SuiteClasses(), 通过这两个注解分别制定使用Suite运行期来运行测试, 以及制定了运行哪些测试类, 其中@SuiteClasses中可以继续制定Suite, 这样JUint会再去寻找里面的测试类, 一直找到能够执行的TestCase并执行之.

    26. JUnit的设计模式:

    ①模板方法模式(Template Method)

    定义一个操作中的算法骨架, 而将一些步骤延伸到子类中去, 是的子类可以不改变一个算法的结构, 即可重新定义该算法的某些特定步骤, 这里需要服用的是算法结构, 也就是步骤, 而步骤的实现可以在子类中完成.

    使用场合:

    1)一次性实现一个算法的不变部分, 并且将可变部分的行为留给子类来完成,

    2) 各子类公共的行为应该被提取出来并集中到一个公共父类中以避免代码的重复. 首先识别现有代码的不同之处, 并且把不同部分分离为新的操作, 最后, 有一个调用这些新的操作的模板方法来替换这些不同的代码.

    3)控制子类的扩展.

    模板方法模式的组成:

    父类角色:提供模板

    子类角色: 为模板提供实现.

    ②适配器(Adapter)模式

    在软件系统中,由于应用环境的变化, 常常需要将"一些现存的对象"放在心的环境中应用, 但是新环境要求的接口时这些现存对象所不能满足的. 那么如何应对这种"迁移的变化"? 如何既能利用现有对象的良好实现, 同时又能满足新的的应用环境所要求的接口? 这就是本文所要说的Adapter模式.

    意图: 将一个类的接口转换成客户希望的另外一个接口, Adapter模式使得原本由于接口不兼容而不能一起工作的那些类可以一起工作.

    适配器(Adapter)模式的构成:

    目标抽象角色(Target)

    --定义客户要用的特定领域的接口.

    适配器(Adapter)

    --调用另一个接口, 作为一个转换器

    适配器(Adaptee)

    --定义一个接口, Adapter需要接入.

    客户端(Client)

    --协同对象符合Adapter适配器.

    适配器的分类:有两种类型的适配器模式:

    --类适配器(采取继承的方式)

    --对象适配器(采取对象组合的方式)推荐

    适用性:

    --对象需要利用现存的并且接口不兼容的类.

    --需要创建可重用的类以协调其他接口可能不兼容的类.

    在JUnit4中的应用:

    runBare( )方法中使用的runTest( )方法.

    image

    在runBare方法中, 通过runTest 方法将我们自己编写的testXXX方法进行了适配, 使得JUnit可以执行我们自己编写的TestCase, runTest 的方法实现如下:

    image

    在runTest方法中, 首先获得我们字节编写的testXXX方法所对应的Method对象(不带参数), 然后见笑哈该Method所对应的方法是否是public的, 如果是则调用Method对象的invoke 方法来去执行我们自己编写的testXXX方法.

    使用对象组合的方式实现适配器模式:

    缺省的适配器模式:(AWT , Swing 事件模型所采用的适配器模式)

    27. 命令模式:

    JUnit的设计使用Pattern Generate Architectures的方式来架构系统, 其设计思想史通过从零才是来应用设计模式, 然后一个接一个, 直至你获得最终合适的系统架构.

    Command模式:将一个请求封装成一个对象, 从而使你可用

    不同的请求对客户经行参数化, 对请求经行排队或记录请求日志..." Command模式告诉我们可以为一个操作生成一个对象并给出它的一个"execute"(执行)方法.

    意图: 将一个请求封装成一个对象, 从而使你可用不同的请求对客户经行参数化; 对请求排队或记录请求日志, 以及支持可撤销的操作.

    命令模式带来的效果:

    ① Command模式将实现请求的一方和调用一方经行解耦.

    ②Command模式使新的TestCase很容易加入, 无需改变已有的类, 只需要继承TestCase类即可, 这样方便了测试人员.

    ③Command模式可以将多个TestCase进行组合成一个命令, TestSuite就是它的复合命令. 当然它使用了Composite模式.

    ④Command模式容易把请求的TestCase组合成请求队列, 这样是接受请求的一方(Junit Framework), 容易决定是否执行请求, 一旦发现测试用例失败或者错误可以立即停止, 进行报告.

    命令模式的构成:

    ①客户角色:创建一个具体命令对象, 并确定其接受者.

    ②命令角色: 声明一个给所有具体命令类的抽象接口, 这是一个抽象角色, 通常由一个接口或抽象类实现.

    ③具体命令角色: 定义一个接受者和行为之间的弱耦合, 实现execute方法, 负责调用接受者的响应操作.

    ④请求者角色: 负责调用命令对象执行请求.

    ⑤接受者角色:负责具体实现和执行一个请求.

    28.我们学习过的设计模式:

    ①单例模式(singleton)

    ②策略模式(Strategy)

    ③代理模式(static proxy, dynamic proxy)

    ④观察者模式(Oberver)

    ⑤装饰模式(Decorator)

    ⑥工厂模式(FactoryMethod)

    ⑦模板模式(Template Method)

    ⑧适配器模式(Adapter)

    ⑨命令模式(Command)

    ⑩组合模式(Composite)

    29. 组合模式(Composite):

    组合模式有时候叫做部分-整体模式, 它使我们属性结构的问题中, 模糊了简单元素和复杂元素的概念, 客户程序可以像处理简单元素一样来处理复杂元素, 从而使得客户程序与复杂元素的内部结构解耦.

    意图: 将对象组合成树形结构, 以表示"部分-整体"的层次结构. Composite模式使得用户对单个对象和组合对象的使用具有一致性.

    组合模式的构成:

    Component(抽象构件接口)

    - 为组合的对象声明接口.

    - 在某些情况下实现从此接口派生出的所有类共有的默认行为.

    - 定义一个接口可以访问及管理它的多个子部件.

    Leaf(叶部件)

    - 在组合中表示叶节点对象, 叶节点没有子节点.

    - 定义组合中接口对象的行为.

    Composite(组合类)

    - 定义所有子节点(子部件)的部件的行为

    - 存储子节点(子部件)

    - 在Component接口中实现与子部件相关的操作.

    Client(客户端):

    -通过Component接口控制组合部件的对象.

    30. 组合模式(Composite ):组合模式有两种实现方式:

    ① 将管理子元素的方法定义在Composite类中,

    ② 将管理子元素的方法定义在Component接口中, 这样Leaf类就需要对这些方法空实现.

    30. Junit的源代码:

    分析源代码比较好的方法是使用调试的方式.

    31. Juint中的错误与失败:

    ① 错误指的是代码中抛出了异常等影响代码正常执行的情况, 比如抛出了ArrayIndexOutOfBoundsException, 这就叫做错误.

    ② 失败指的是我们断言所期待的结果与程序实际执行的结果不一致, 或者是直接调用了fail() 方法, 这叫做失败.

    32. JUnit中所使用的观察者模式:

    33. 对于测试类来说, 如果一个测试类中有5个测试方法, 那么JUnit就会创建5个测试的对象, 每一个对象只会调用一个测试方法(为了符合命令模式的要求), 在添加方法之前, 需要首先判断测试方法是否满足public , void, no-arg, no-return 这些条件, 如果满足则添加则添加到集合当中准备作为测试方法去执行.

    本博客内容所有权限保留,若需合作请与博主联系.博主邮箱:donaldjohn@qq.com
  • 相关阅读:
    生产上第一使用线程池后的总结与反思
    20190407
    20190403
    Asp.net MVC中的ViewData与ViewBag
    easyui datagrid分页
    EF从数据库更新模型更新不到新表
    C语言 笔记(函数)
    python 写100~1000以内水仙花数
    python 求前n项阶乘的和
    python 写九九乘法表
  • 原文地址:https://www.cnblogs.com/donaldjohn/p/2010077.html
Copyright © 2011-2022 走看看