为什么要做自动化测试

  • 可以频繁的进行测试
  • 可以在任何时候进行测试,也可以按计划定时测试
  • 比人工测试快
  • 快速发现错误
  • 可靠
  • 测试代码与生产代码紧密结合
  • 代码规范

自动化测试的分类

单元测试:可以测试某个类或方法,具有较高的深度,对应用的功能覆盖面很小。

  • 集成测试:有更好的广度,可以测试web资源,数据库资源等。
  • 皮下测试:在web中针对controller下的节点测试。
  • UI测试:是对应用的界面功能测试。
    常用的是单元测试和集成测试。

什么是单元测试

一个单元测试是一段自动化的代码,这段代码调用被测试的工作单元,对这个单元的单个最终结果的某些假设进行验证。单元测试用单元测试框架编写,容易编写、快速运行、测试可靠、可读、可维护。只要产品代码不发生变化则单元测试的结果是稳定的。

传统单元测试开发流程

测试驱动开发(Test Driven Development ,TDD)流程

测试命名基本规则

  • 项目:[ProjectUnderTest].UnitTests
  • 类:[ClassName]Tests
  • 工作单元(方法):[UnitOfWorkName][ScenarioUnderTest][ExpectedBehavior]
    UnitOfWorkName被测试的方法,一组方法或者一组类。Scenario测试进行的假设条件
    ExpectedBehavior在测试进行的假设条件下,对测试方法行为的预期。测试方法的行为有三种可能结果:返回一个值(一个真实值,或者一个异常);改变系统状态(例如在系统中添加一个用户,导致在下次登入时系统的行为发生变化);调用第三方系统(例如一个外部的Web服务)。

测试单元命名举例:对IsValidLogFileName方法进行测试,假设条件是给方法传入一个有效的文件类型,预期行为是方法返回一个值True。则可以把测试命名为IsValidLogFileName_BadExtension_ReturnFalse

测试三阶段AAA

  • 准备(Arrange):做一些先决条件,例如创建对象实例,数据,输入等等。
  • 操作(Arc):执行生产代码并返回结果,例如调用方法,或这设置属性。
  • 断言(Assert):检查结果,测试通过或失败。

优秀的单元测试

无论如何组织测试,无论有多少测试,如果不能信任、维护和阅读它们,这些测试就几乎没有价值,要写优秀的单元测试,它们应同时具备三属性:1、可靠性;2、可维护性;3、可读性。

  • 编写可靠的测试

    • 决定何时删除或修改测试

      • 产品缺陷
      • 测试缺陷
      • 语义或者API变更
      • 冲突或者无效的测试
      • 重命名或者重构测试
      • 删除重复测试
    • 避免测试中的逻辑分支判断
      单元测试不应该有逻辑:switch、if else语句,foreach、for或while循环。因为这样的 测试可读性较差,也比较脆弱,增加测试代码复杂度,容易包含隐藏缺陷。

    • 只测试一个关注点
      一个关注点是一个单元测试的一个最终结果:一个返回值,系统状态的一个改变或对第三方对象的一个调用。在一个单元测试中验证多个关注点使测试变得复杂,应该对每个关注点的测试分开的独立的验证。

    • 把单元测试和集成测试分开

    • 用代码审查确保代码覆盖率

  • 编写维护的测试

    • 测试私有或受保护的方法
      开发人员把方法设为私有或者受保护的,通常有着充分的理由。有时是为了隐藏实现细节,以便将来实现的变化不会影响外部功能。也可能是出于安全或者知识产权相关的原因。如果一个私有方法值得进行测试,那么它也许应该设为公共的,静态的或者至少是内部的,并且定义使用它的公共契约。这也是TDD相比传统测试的一个有点,可以避免不必要的重构。

      • 使方法成为公共方法
      • 把方法抽取到新类
      • 使方法成为静态方法
      • 使方法成为内部方法结合特性,让测试可以调用该方法
  • 去除重复测试代码

  • 编写可读测试

    • 单元测试命名规范
    • 有意义的断言
    • 断言和操作分离

xUnit测试框架

xUnit官网
xUnit源码
xUnit案例
xUnit文档

支持平台:

  • .NET Framework
  • .NET Core
  • .NET Standard
  • UWP
  • Xamarin

特点:

  • 支持多平台
  • 并行测试
  • 数据驱动测试
  • 可扩展

产品代码、测试代码、测试工具的关系:
测试项目需要引用被测试项目从而进行测试,测试项目同时需要引用xUnit库。测试编写好后用Test Runner来运行测试。Test Runner可以读取测试代码,并且会知道我们所使用的测试框架,然后执行,并显示结果。目前可用的Test Runner包括vs自带的Test Explorer或者dotnet core命令行,以及第三方工具,例如resharper等。

什么是Assert

Assert基于代码的返回值,对象的最终状态,事件是否发生等情况来评估测试的结果。
Assert的结果可能是Pass或者Fail。如果所有的assert都pass了,那么整个测试就成功了;如果有任何assert fail了,那么测试就失败 。

xUnit提供了一下类型的assert

  • boolean:true/fale
  • String:相等/不等;是否为空;以…开始/结束;是否包含子字符串;匹配正则表达式。
  • 数值型:相等/不相等;是否在某个范围内;浮点的精度。
  • Collection:内容是否相等;是否包含某个元素;是否包含满足某种条件(predicate)的元素;是否所有的元素都满足某个assert。
  • Raised events:Custom events;Framework events(例如:PropertyChanged)。
  • Object Type:是否是某种类型;是否某种类型或继承与某种类型。
  • Assert.Throws:断言异常。
  • Assert.Raises:断言事件。
  • Assert.PropertyChanged:断言属性改变事件是否触发。

建议每个test方法里面只有一个assert;或者每个test里可以有多个assert,但是这些assert都要针对同一个行为。

测试方法管理优化

  • 测试分组:[Trait(“Name”, “Value”)] 方法级,类级。
  • 或略测试[Fact(Skip = “暂时忽略这个测试”)]
  • 自定义测试输出内容:ITestOutputHelper,使用该Helper需要构造函数注入。
  • 减少重复代码
  • 重构代码
  • 共享上下文:同一个测试类中共享,测试实现共享上下文需要测试继承共享资源类的IClassFixture泛型类型接口,并在构造函数中注入该实例。共享资源,只创建一次,防止运行每个测试方法调用构造函数重复创建资源。不同的测试类中共享。测试类统一标志CollectionDefinition特性,如:[CollectionDefinition(“Lone Time Task Collection”)]用来实现不同测试类对同一实例的共享。

数据驱动测试

使用[Theory]属性来测试几个不同的数据输入,数据来源:

  • [InlineData]
  • [MemberData(nameof(xxx), MemberType = typeof(xxx))]
  • 自定义特性继承自DataAttribute的数据
  • 外部数据源

学习代码

参考:
《单元测试的艺术 第二版》
https://www.cnblogs.com/cgzl/p/8283610.html

单元测试xUnit学习相关推荐

  1. 单元测试-xUnit

    单元测试-xUnit Assert常用方法 名称 描述 Eqalexpected.result) 断言结果与期望值相等.该方法的重载版本用于比较不同的类型和集合.该方法的另一种版本接受一个额外参数 该 ...

  2. iOS 单元测试- 入门学习2

    前言 维基百科对单元测试的定义如下: 在计算机编程中,单元测试(英语:Unit Testing)又称为模块测试, 是针对程序模块(软件设计的最小单位)来进行正确性检验的测试工作.程序单元是应用的最小可 ...

  3. 【Pytest:Python 单元测试工具学习】

    [Pytest:Python 单元测试工具学习] Brief Introduction to Pytest Installation A Simple Testing Testing Whether ...

  4. C#/.net 单元测试xUnit、Mock、Moq

    C#/.net 单元测试xUnit.Mock.Moq 在做单元测试的时候,有时需要引用很多的外部对象,例如网络通信.记录日志等.单元测试无法控制这些外部的依赖对象,所以需要使用Stub和Mock来模拟 ...

  5. 详谈单元测试-xUnit

    简介 xUnit.net 是针对 .NET 的免费,开源单元测试框架,可并行测试.数据驱动测试.测试项目需引用被测试项目,从而对其进行测试,测试项目同时需要引用 xUnit.测试编写完成后,用 Tes ...

  6. .net、C#单元测试xUnit

    xUnit单元测试 测试的分类 单元测试:对某个类或者某个方法进行测试 集成测试:可使用Web资源.数据库数据进行测试 皮下测试:在Web中对controller下的节点测试 UI测试:对界面的功能进 ...

  7. 单元测试-xUnit总结

    xUnit总结 什么是xUnit xUnit.net是针对.NET Framework的免费,开源,以社区为中心的单元测试工具. 自动化测试的优点 可以频繁的进行测试 可以在任何时间进行测试,也可以按 ...

  8. unittest测试框架_python接口自动化测试 - 4.unittest单元测试框架学习

    简介 unittest就是python的一个单元测试框架,unittest非常适合做自动化测试. 官方源码栗子: import unittestclass IntegerArithmeticTestC ...

  9. Xunit.net 单元测试学习——按顺序测试

    最近一直在提高编码的质量,为了保证质量,必须有一套趁手的兵器,Xunit.Net 就是如此霸气的利器. 怎么编写单元测试 怎么会有如此低级的疑问呢?因为从接触单元测试,到使用上,真的不是一个简单的心路 ...

最新文章

  1. 学术 | 据说以后在探头下面用帽子挡脸没用了:用于遮挡物检测的对称卷积神经网络——SymmNet...
  2. AVG杀毒软件添加信任程序
  3. 【Heritrix基础教程之1】在Eclipse中配置Heritrix
  4. vue和java bean_Java:JavaBean和BeanUtils
  5. php递归简单例子,php递归json类实例
  6. css布局:多列等高布局
  7. oracle通信通道的文件结尾_oracle里执行full join 报通信通道的文件结尾问题
  8. 测试页能打印 软件不能打,Windows7分享打印机能打测试页打印文件怎么没反应
  9. 学生考勤系统设计mysql_学生考勤系统的设计与实现(Eclipse,MySQL)
  10. 用Python制作核酸检测日历
  11. JavaScript 原型
  12. Essential Qt 第二十一章 本地目录
  13. 关于H5页面在iPhoneX刘海屏适配(转)
  14. Android地图定位-百度地图上定位自己所在的位置
  15. “工资倒挂”成常态,你介意新员工比你工资高吗?
  16. 用vscode开发autojs,输出窗口不显示任何输出结果
  17. 十大低代码开发平台排行榜,低代码开发平台哪个好用?
  18. 爬取豆瓣前250电影数据
  19. WPF Excel导入01
  20. ai切换rgb模式_当AI频繁切换色彩预览模式时 颜色会越变越深 求解?

热门文章

  1. jq循环遍历元素的高度,判断超出显示更多按钮
  2. Paint - 简介
  3. 客户逾期贷款预测[8] - 特征选择(iv值、随机森林)
  4. STC液压伺服控制系统
  5. 在线JSON转CSV,TSV工具
  6. Verilog语法规则
  7. 论文阅读:RoadMap: A Light-Weight Semantic Map for Visual Localizationtowards Autonomous Driving轻量语义自动驾驶
  8. 文件服务器防止资料拷贝,局域网如何防止文件被复制、禁止复制文件、如何防止文件拷贝的方法...
  9. 概率论与数理统计学习笔记——第四十讲——卡方分布
  10. 【平头哥RVB2601开发板试用体验】基于 HTTPClient 的云语音识别 1