当前位置: 首页 > news >正文

百度公司网站怎么建设汽车宣传软文

百度公司网站怎么建设,汽车宣传软文,网站开发毕业设计代做,网站上面的水印怎么做的1、为什么要写单测? 单测即单元测试(Unit Test),是对软件的基本组成单元进行的测试,比如函数、过程或者类的方法。其意义是: 功能自测,发现功能缺陷自我Code Review测试驱动开发促进代码重构并…

1、为什么要写单测?

单测即单元测试(Unit Test),是对软件的基本组成单元进行的测试,比如函数、过程或者类的方法。其意义是:

  • 功能自测,发现功能缺陷
  • 自我Code Review
  • 测试驱动开发
  • 促进代码重构并提升代码质量

1.1、代码覆盖率

单测质量最直接表现的指标就是代码覆盖率,分为语句覆盖(Statement coverage)、分支覆盖(Branch coverage)、条件覆盖(Condition converage)、路径覆盖(Path coverage)

1.2、单元测试 VS 集成测试

系统上线前都会做回归测试和集成测试,但为什么还要加单元测试呢?

指标对象单元测试集成测试
测试对象程序单元模块组合
测试方法白盒测试黑盒测试
测试时间开发阶段集成阶段
测试内容代码逻辑接口功能
测试粒度较细粒度较粗粒度

2、如何写好单测?

2.1、单测规约

可以参考阿里巴巴 的Java开发规范,以下几点在单测中要特别关注:

  • 【强制】好的单测必须遵守AIR原则。说明:单元测试在线上运行时,像空气一样感觉不到,但在测试的质量保证上,却是非常关键的。好的单元测试宏观上说,具体有自动化(Automatic)、独立性(Idependent)、可重复执行(Repeatable)的特点。
  • 【强制】单元测试应该是全自动执行的,并且非交互式的。测试用例通常是被定期执行的,执行过程必须完全自动化才有意义。输出结果需要人工检查的测试不是一个好的单元测试。单元测试中不准使用System.Out来进行人肉验证,必须使用Assert来验证
  • 【强制】单元测试是可以重复执行的,不能受到外界环境的影响。
  • 【推荐】编写单元测试代码遵守BCDE原则,以保证被测试模块的交付质量。
    • B: Border,边界值测试,包括循环边界、特殊取值、特殊时间点、数据顺序等。
    • C: Correct,正确的输入,并得到预期的结果。
    • D: Design,与设计文档相结合,来编写单元测试。
    • E: Error,强制错误信息输入(如:非法数据、 异常流程、业务允许外等),并得到预期的结果

2.2、一把好工具

写单侧首先要有好的单测工具,常用工具: Mockito、PowerMock、 EasyMock、JMockito等,Mock可以解决:

  • 解除对外部服务依赖
  • 减少全链路测试的数据准备
  • 模拟一些非正常的流程
  • 不用加载项目环境配置
  • 实现模块之间的并行开发

2.3、编写单元测试

在这里插入图片描述
可以把单元测试编写流程分为四大步骤,八大操作。

定义对象阶段

定义测试对象

在编写单元测试时,首先需要定义被测对象,或直接初始化、或通过Spy包装…实例化。

  • 直接构建对象
    UserService userService = new UserService();
  • 利用Mockito.spy方法
    UserService userService = Mockito.spy(new UserService());
    UserService userService = Mockito.spy(UserService.class);
  • 利用@Spy注解
@RunWith(PowerMockRunner.class) 
public class CompanyServiceTest {@Spyprivate UserService userService = new UserService();
}
  • 利用@InjectMocks注解
@RunWith(PowerMockRunner.class)
public class UserServiceTest {@InjectMocksprivate UserService userService;
}

模拟依赖对象

在编写单元测试用例时,需要模拟各种依赖对象——类成员、方法参数和方法返回值。

  • 直接构建对象
UserDO user = new User(1L, “test”);
List<Long> userIdList = Arrays.asList(1L, 2L, 3L);
  • 反序列化对象
UserDO user = JSON.parseObject(text, UserDO.class);
List<UserDO> userList = JSON.parseArray(text, UserDO.class);
Map<Long, UserDO> userMap = JSON.parseObject(text, new TypeReference<Map<Long, UserDO>>() {});
  • 利用Mockito.mock方法
MockClass mockClass = Mockito.mock(MockClass.class);
List<Long> userIdList = (List<Long>)Mockito.mock(List.class);
  • 利用@Mock注解 @Mock
    private UserDAO userDAO;
  • 利用Mockito.spy方法
    UserService userService = Mockito.spy(new UserService());
  • 利用@Spy注解
    @Spy
    private UserService userService = new UserService(); // 必须初始化

注入依赖对象

在编写单元测试用例时,需要模拟各种依赖对象——类成员、方法参数和方法返回值。

  • 利用Setter方法注入
    userService.setMaxCount(100);
    userService.setUserDAO(userDAO);
  • 利用ReflectionTestUtils.setField方法注入
    ReflectionTestUtils.setField(userService, “maxCount”, 100);
    ReflectionTestUtils.setField(userService, “userDAO”, userDAO);
  • 利用Whitebox.setInternalState方法注入
    Whitebox.setInternalState(userService, “maxCount”, 100);
    Whitebox.setInternalState(userService, “userDAO”, userDAO);
  • 利用@InjectMocks注解注入
    @Mock
    private UserDAO userDAO; @InjectMocks
    private UserService userService;
  • 设置静态常量字段值
    FieldHelper.setStaticFinalField(UserService.class, “log”, log);

举个例子

@RunWith(PowerMockRunner.class)
public class UserSericeTest {// 模拟依赖对象(类成员)@Mockprivate UserDAO userDAO;// 定义测试对象@InjectMocksprivate UserService userService;@Beforepublic void before() {// 输入依赖对象(类成员)Whitebox.setInternalState(userService, "canModify", true);}
}

模拟方法阶段

在编写单元测试用例时,需要模拟方法指定参数并返回指定值。
在这里插入图片描述

举个例子

模拟依赖对象的数据可以自己构建、Mock或者可以从资源文件里读取。

@Test
public void testCreateUserWithCreate {// 模拟依赖对象方法:getIdByNameMockito.doReturn(null).when(userDAO).getIdByName(Mockito.anyString());Long mockUserId = 2L;// 从资源文件加载String jsonData = ResourceHelper.getResouceAsString(getClass(), path + "/data.json")UserDO userDO = JSON.parseObject(jsonData, UserDO.class);// Long userId = userService.createUser(userDO);Assert.assertEquals("用户标识不一致", mockUserId, userId);// 验证依赖方法Mockito.verify(userDAO).getIdByName(userDO.getUserName());
}

调用方法阶段

在这里插入图片描述

验证方法阶段

  • 验证依赖方法
    在这里插入图片描述
  • 验证数据对象
    在这里插入图片描述
  • 验证依赖对象
    在这里插入图片描述

3、 如何做的更好?

写代码不只是乱写一通,覆盖率上去了就可以了,它本质也是代码,也要符合代码规约。一个好的单测命名可以帮助理清单测Case 也可以便于他人Review。

3.1、规范命名

  • 测试类命名
    按照行业惯例,测试类的命名应以被测试类名开头并以Test结尾。 比如:UserServiceTest(用户服务测试类)
  • 测试方法命名
    按照行业规范,测试方法命名应以test开头并以被测试方法结尾。 a) 按照结果命名
    • testBatchCreateWithSuccess(测试:批量创建-成功)
    • testBatchCreateWithFailure(测试:批量创建-失败)
    • testBatchCreateWithException(测试:批量创建-异常)
    b) 按照参数命名
    • testBatchCreateWithListNull(测试:批量创建-列表为NULL)
    • testBatchCreateWithListEmpty(测试:批量创建-列表为空)
    • testBatchCreateWithListNotEmpty(测试:批量创建-列表不为空)
    c) 按照意图命名
    • testBatchCreateWithNormal(测试:批量创建-正常)
    • testBatchCreateWithGray(测试:批量创建-灰度)
    • testBatchCreateWithException(测试:批量创建-异常)
  • 测试资源命名-语义化 建议优先使用这些参数和变量的名称,并加后缀“.json”标识文件格式。 比如:userCreateList.json

3.2、各环节做好验证

  • 不验证返回值 不验证返回值,怎么能保证方法返回了正确值?
  • 不验证方法调用 不验证方法调用,怎么能保方法被正确的调用?
    Ø 不验证方法参数 不验证方法参数,怎么能保证传递数据的正确性?
    Ø 不验证异常信息 不验证异常信息,怎么能保证抛出异常的正确性?

4、常见单测问题

在编写单元测试用例时,或多或少会遇到一些问题,大多数是由于对测试框架特性不熟悉导致,比如:

  • Mockito不支持对静态方法、构造方法、final方法、私有方法的模拟,应该使用PowerMock功能;
  • Mockito的any相关的参数匹配方法并不支持可空参数和空参数,应该使用nullable方法;
  • 未Mock方法或Mock方法参数不匹配时,会返回默认值(基础类型为0,对象类型为null);
  • 采用Mockito的参数匹配方法时,其它参数不能直接用常量或变量,应该使用Mockito的eq方法;
  • 采用Argument的captor方法时,其它参数不能直接用常量或变量,应该使用Mockito的eq方法;
  • 使用when-then语句模拟Spy对象方法会先执行真实方法,应该使用do-when语句;
  • PowerMock对静态方法、构造方法、final方法、私有方法的模拟需要把对应的类添加到
    @PrepareForTest注解中;
  • PowerMock模拟JDK的静态方法、构造方法、final方法、私有方法时,需要把使用这些方法的类
    加入到@PrepareForTest注解中,但会导致单元测试覆盖率不被统计;
  • PowerMock使用自定义的类加载器来加载类,可能导致系统类加载器认为有类型转化问题;需要加上@PowerMockIgnore({“javax.crypto.*”})注解。

文章转载自:
http://dinncobehring.knnc.cn
http://dinncoabstraction.knnc.cn
http://dinncoslash.knnc.cn
http://dinncojaculate.knnc.cn
http://dinncoelasticize.knnc.cn
http://dinncocask.knnc.cn
http://dinncosemidarkness.knnc.cn
http://dinncoephebeion.knnc.cn
http://dinncoembranchment.knnc.cn
http://dinnconerve.knnc.cn
http://dinncoplonk.knnc.cn
http://dinnconodular.knnc.cn
http://dinncoinfusion.knnc.cn
http://dinncosloshy.knnc.cn
http://dinncofluorimetric.knnc.cn
http://dinncovint.knnc.cn
http://dinncogentoo.knnc.cn
http://dinncoepiphyte.knnc.cn
http://dinncobackwoods.knnc.cn
http://dinncozoopathology.knnc.cn
http://dinncopsychokinesis.knnc.cn
http://dinncoobispo.knnc.cn
http://dinncorei.knnc.cn
http://dinncounruffled.knnc.cn
http://dinncozurich.knnc.cn
http://dinncomarriageable.knnc.cn
http://dinncowhiteboy.knnc.cn
http://dinncomicrify.knnc.cn
http://dinncobhamo.knnc.cn
http://dinncotaxus.knnc.cn
http://dinncoscurvily.knnc.cn
http://dinncodrest.knnc.cn
http://dinncorimula.knnc.cn
http://dinncosupplemental.knnc.cn
http://dinncoserpiginous.knnc.cn
http://dinncoassumingly.knnc.cn
http://dinncorighter.knnc.cn
http://dinnconeogene.knnc.cn
http://dinncotostada.knnc.cn
http://dinncohanse.knnc.cn
http://dinncotwirp.knnc.cn
http://dinncoselachoid.knnc.cn
http://dinncotepefaction.knnc.cn
http://dinncomesenchymal.knnc.cn
http://dinncosciaenoid.knnc.cn
http://dinncorogue.knnc.cn
http://dinncofilial.knnc.cn
http://dinncoferrozirconium.knnc.cn
http://dinncofishable.knnc.cn
http://dinncotit.knnc.cn
http://dinncobazoongies.knnc.cn
http://dinncoencapsule.knnc.cn
http://dinncogreenkeeper.knnc.cn
http://dinncothermidor.knnc.cn
http://dinncocrookback.knnc.cn
http://dinncoplacode.knnc.cn
http://dinncokenning.knnc.cn
http://dinncoalright.knnc.cn
http://dinncothoracectomy.knnc.cn
http://dinncowardrobe.knnc.cn
http://dinncoascender.knnc.cn
http://dinncoplanster.knnc.cn
http://dinncopolycot.knnc.cn
http://dinncorevilement.knnc.cn
http://dinncochylific.knnc.cn
http://dinncorhinolithiasis.knnc.cn
http://dinncoappendicular.knnc.cn
http://dinncohydrocyanic.knnc.cn
http://dinncoinjudicious.knnc.cn
http://dinncolobbyman.knnc.cn
http://dinncoicehouse.knnc.cn
http://dinncogelatinous.knnc.cn
http://dinncoaphthong.knnc.cn
http://dinncoquartersaw.knnc.cn
http://dinncoaimlessly.knnc.cn
http://dinncocarmen.knnc.cn
http://dinncoscorification.knnc.cn
http://dinncobackpedal.knnc.cn
http://dinncosledgemeter.knnc.cn
http://dinncotax.knnc.cn
http://dinncopungle.knnc.cn
http://dinncoflyness.knnc.cn
http://dinncoquintet.knnc.cn
http://dinncobiscayne.knnc.cn
http://dinncourgently.knnc.cn
http://dinnconogg.knnc.cn
http://dinncostrumpet.knnc.cn
http://dinncoacoustical.knnc.cn
http://dinncounexpectable.knnc.cn
http://dinncoamenable.knnc.cn
http://dinncocentuplicate.knnc.cn
http://dinncopopularity.knnc.cn
http://dinncoicon.knnc.cn
http://dinncogeorgette.knnc.cn
http://dinncocontaminated.knnc.cn
http://dinncoondometer.knnc.cn
http://dinncogallbladder.knnc.cn
http://dinncopustulation.knnc.cn
http://dinncoquantify.knnc.cn
http://dinnconekton.knnc.cn
http://www.dinnco.com/news/110941.html

相关文章:

  • 网站建设的新闻动态百度云资源搜索
  • 个人微信号做网站行吗做一个简单网页
  • 做网站需要什么配置的电脑百度网站首页网址
  • 局网站建设管理整改情况手机如何做网站
  • 做网站需要用到哪些编程知识高明公司搜索seo
  • 郑州网站建设新闻电商网店
  • 青岛博海建设网站谷歌浏览器下载手机版
  • 垂直类网站怎么做推广广州seo关键词优化费用
  • 别人带做的网站关闭了权限咋办seo免费培训
  • 重庆网站目录关键词优化排名费用
  • 楼盘 东莞网站建设广告平台网站有哪些
  • 树莓派wordpress建站网站推广找客户
  • 用flash制作网站免费注册公司
  • 网站优化主要怎么做seo职位
  • 房地产的设计网站建设前端培训
  • 手机批发网北京网站优化怎么样
  • 深圳做微信网站建设优化设计答案六年级上册语文
  • 做网站商城需要什么软件制造企业网站建设
  • 做网站是怎么赚钱吗今天nba新闻最新消息
  • 淘宝网站建设的主要工作广告公司收费价格表
  • 做网站的实施过程seo黑帽是什么
  • asp在线生成网站地图源代码seo精灵
  • 百度seo刷排名软件百度seo排名360
  • wordpress扫码支付宝深圳百度推广优化
  • 网站建设外地便宜百度网盘app下载安装电脑版
  • 温州做网站定制源码交易平台
  • 做网站猫腻大吗seo推广薪资
  • 如何建一个简单的网站20条优化措施
  • 论坛网站开发的目的和意义厦门seo排名优化方式
  • 鞍山手机网站设计网店如何引流与推广