在上节中,完成了第一个单元测试,研究了各种特性,在本节,将介绍一些更实际的例子.SUT依赖于一个不可操控的对象,最常见的例子是文件系统,线程,内存和时间等. 本系列将分成3节: 单元测试基础知识 打破依赖,使用模拟对象,桩对象,隔离框架 创建优秀的单元测试 本节索引: 伪对象.桩对象. 模拟对象 为什么需要伪对象,如何处理 手工新建伪对象 使用隔离框架创建伪对象 伪对象(fake) 桩对象(stub) 模拟对象(mock) 伪对象是一个通用术语,它即可指桩对象,也可指模拟对象. 桩对象是指对系统…
单元测试不是软件开发的新概念,在1970年就一直存在,屡屡被证明是最理想的方法之一. 本系列将分成3节: 单元测试基础知识 打破依赖,使用模拟对象,桩对象,测试框架 创建优秀的单元测试 本节索引: 单元测试与集成测试 测试驱动开发 UnitTest和NUnit 第一个单元测试 命名规范 单元测试与集成测试 单元测试几乎总是基于框架来写的,因为框架可以为我们提供统一的API来管理测试. 常用的框架有Unit Test(MS Test),NUnit(开源) 定义 单元测试是一段代码调用另一段代码,随…
之前学习了单元测试的基础知识,以及桩对象和模拟对象的不同作用.但在实际应用中,往往不会直接手写桩对象或者模拟对象,而是使用隔离框架动态的创建这些对象,这可以让测试变得更简便.快捷,还可以更好地应对复杂的测试.这里学习的便是隔离框架的一种——Nsubstitute. 一 开始使用NSubstitute 在前面有一个测试场景为:使用LogAnalyzer.Analyze方法分析文件,如果文件名过短,就记录日志,为了测试LogAnalyzer类与ILogger实现之间的交互,需要手写一个实现了ILog…
最近在看.net单元测试艺术,我也喜欢单元测试,今天介绍一下如何测试异常.如何测试返回值.如何测试模拟对象的参数传递.如何测试数据库访问代码.单元测试框架使用的是NUnit,模拟框架使用的是:Rhino.Mocks. 1.测试异常,可以直接对方法进行异常测试,也可以对模拟对象进行异常测试,但是,对模拟对象进行异常测试,很少用,所以,这里就介绍对方法的异常测试.请看如下代码,当用户名为空的时候,抛出异常. public bool Valid(string userName, string pass…
Spring依赖注入 --- 模拟实现 面向接口编程,又称面向抽象编程, 数据库如果发生更改,对应的数据访问层也应该改变多写几个实现,需要用谁的时候在service里new谁就可以了面向抽象编程的好处就是灵活. 创建用户实体类, /ImitateSpring/src/yuki/spring/imitate/pojo/User.java package yuki.spring.imitate.pojo; public class User { private String username; pr…
使用new和字面量的的方法是两种主流创建对象的方法,两种最终都能达到同样的实例化的对象,本章主要围绕new关键字来实例化一个对象并且讲一个不使用new但是完全与new实例化对象相同的例子. 在使用new后面跟一个构造函数的时候,将会返回一个新对象, 这个对象中的属性便就是new后面跟的构造函数中的this的属性, 这个对象的__proto__属性指向就是new后面的构造函数的prototype属性. prototype属性的值是一个对象,是Javascript为每一个函数内置的一个属性,也就是说…
List 3.1 抽取一个设计文件系统的类,并调用它 [Test] public bool IsValidLogFileName(string fileName) { FileExtensionManager mgr = new FileExtensionManager(); return mgr.IsValid(fileName); } class FileExtensionManager { public bool IsValid(string fileName) { // Read fil…
有些单元测试需要恰当的测试“缝隙”(test seam)来模拟/隔离一些不想被测试的部分.如果你正想在代码中引入这种单元测试,那么今天介绍的重构就十分有用.在这个例子中,我们的客户端代码使用一个静态类来实现功能.但当需要单元测试时,问题就来了.我们无法在单元测试中模拟静态类.解决的方法是使用一个接口将静态类包装起来,形成一个缝隙来切断与静态类之间的依赖.      public class AnimalFeedingService { private Boolean FoodBowlEmpty;…
目录 定义一个待测试API 测试用例 为减少篇幅,隐藏了SampleEntity和SqliteDbContext 定义一个待测试API 如下,我们定义了一个名为Sample的API,其中有一个外部依赖项SqliteDbContext [Route("api/[controller]")] [ApiController] public class SampleController : ControllerBase { private readonly SqliteDbContext _s…
List 1.1 一个要测试的SimpleParser类 using System; namespace AOUT.CH1.Examples { public class SimpleParser { public int ParseAndSum(string numbers) { ) { ; } if(!numbers.Contains(",")) { return int.Parse(numbers); } else { throw new InvalidOperationExce…
List 2.1 使用[SetUp]和[TearDown]特性 using System; using System.Collections.Generic; using System.Linq; using System.Text; using NUnit.Framework; namespace AOUT.LogAn.Tests { [TestFixture] public class LogAnalyzerTests { private LogAnalyzer _analyzer = nu…
Mock库的应用 Mock在Python3.3之前是第三方库,需要安装 pip install Mock :导入 import mock Mock在Python3.3之后是Python标准库,导入方式为 from unittest import mock Mock能够让我们模拟单元测试中不可用或繁重的资源:还可以模拟Python对象的行为 Mock 使用的原因: 一.环境由于客观原因由于无法搭建 二.搭建服务器的值需要大量工作才行 实现代码如下: import requestsimport sh…
移动浏览器原生click事件有300ms的延时,这是浏览器为了区分到底是双击还是单击事件.(实际上有些移动浏览器不支持双击事件.PC版chrome在手机模式下,当禁止用户双击缩放页面时(即有viewport meta标签时,不管user-scalable为yes或no),双击会触发两次click事件,但并不会触发dblclick事件,当允许用户双击缩放页面时(即没有viewport meta标签时),双击不会触发click事件,也不会触发dblclick事件,而是会缩放页面:在正常模式下(即PC…
1.依赖倒置的相关概念 http://www.cnblogs.com/fuchongjundream/p/3873073.html IoC模式(依赖.依赖倒置.依赖注入.控制反转) 2.依赖倒置的方式 http://www.cnblogs.com/muzinian/p/3357741.html 于依赖反转原则.控制反转和依赖注入的抽象的初学者指南 3.主流ioc框架 http://www.cnblogs.com/bchp/articles/1527693.html http://www.cnbl…
第三百三十三节,web爬虫讲解2—Scrapy框架爬虫—Scrapy模拟浏览器登录 模拟浏览器登录 start_requests()方法,可以返回一个请求给爬虫的起始网站,这个返回的请求相当于start_urls,start_requests()返回的请求会替代start_urls里的请求 Request()get请求,可以设置,url.cookie.回调函数 FormRequest.from_response()表单post提交,第一个必须参数,上一次响应cookie的response对象,其…
1. IOC - 控制反转(依赖注入) 所谓的IOC称之为控制反转,简单来说就是将对象的创建的权利及对象的生命周期的管理过程交 由Spring框架来处理,从此在开发过程中不再需要关注对象的创建和生命周期的管理,而是需要 时由Spring框架提供,这个由Spring框架管理对象创建和生命周期的机制称之为控制反转.而在 创建对象的过程中Spring可以依据配置对象的属性进行设置,这个过程称之为依赖注入,即DI. 2.IOC的入门案例 a.下载Spring 访问Spring官网,下载Spring相关的…
模拟浏览器登录 start_requests()方法,可以返回一个请求给爬虫的起始网站,这个返回的请求相当于start_urls,start_requests()返回的请求会替代start_urls里的请求 Request()get请求,可以设置,url.cookie.回调函数 FormRequest.from_response()表单post提交,第一个必须参数,上一次响应cookie的response对象,其他参数,cookie.url.表单内容等 yield Request()可以将一个新…
using System.Text; using System.Net; using System.IO; using System.Text.RegularExpressions; using System.Security.Cryptography.X509Certificates; using System.Net.Security; namespace WebRequestTest { /// <summary> /// 动态类,每个实例使用单独session /// </sum…
近期要做的一个项目,支持方提供的一个Map方法,用着相当能够,功能稍有欠缺,因此我为之做了扩展,下面是代码: function Map() { this.elements = new Array(); //获取MAP元素个数 this.size = function() { return this.elements.length; }; //推断MAP是否为空 this.isEmpty = function() { return (this.elements.length < 1); }; //…
单向链表: class error(Exception): def __init__(self,msg): super(error,self).__init__() self.msg=msg def __str__(self): return self.msg class Node: def __init__(self,ele): self.ele=ele self.next=None class mylist: def __init__(self,ele=None): self.index=0…
开篇:上一篇我们学习基本的单元测试基础知识和入门实例.但是,如果我们要测试的方法依赖于一个外部资源,如文件系统.数据库.Web服务或者其他难以控制的东西,那又该如何编写测试呢?为了解决这些问题,我们需要创建测试存根.伪对象及模拟对象.这一篇中我们会开始接触这些核心技术,借助存根破除依赖,使用模拟对象进行交互测试,使用隔离框架支持适应未来和可用性的功能. 系列目录: 1.入门 2.核心技术 3.测试代码 一.破除依赖-存根 1.1 为何使用存根? 当我们要测试的对象依赖另一个你无法控制(或者还未实…
NET单元测试的艺术 开篇:上一篇我们学习基本的单元测试基础知识和入门实例.但是,如果我们要测试的方法依赖于一个外部资源,如文件系统.数据库.Web服务或者其他难以控制的东西,那又该如何编写测试呢?为了解决这些问题,我们需要创建测试存根.伪对象及模拟对象.这一篇中我们会开始接触这些核心技术,借助存根破除依赖,使用模拟对象进行交互测试,使用隔离框架支持适应未来和可用性的功能. 系列目录: 1.入门 2.核心技术 3.测试代码 4.设计和流程 一.破除依赖-存根 1.1 为何使用存根? 当我们要测试…
最近在看.net单元测试艺术,我也喜欢单元测试,这里写一下如何在测试中解除对象间的依赖. 假如有这样的一个需求,当用户登陆时,我需要对用户名和密码进行验证,然后再将用户名写入日志中. public class MyLogin { public bool Valid(string userName, string passWord) { var isValid = userName == "admin" && passWord == "123456";…
首先要啰嗦几句. 单元测试是TDD的重要实践方法,也是代码质量的一种保证手段.在项目的工程化开发中,研发人员应该尽量保证书写Unit Test,即使不使用TDD. (VS中,我们可以直接使用微软提供的一套单元测试框架,一般使用足够了,特别需求的话,可以使用其他更好的框架.) 书写单元测试时,我们并不一定真的要去连接数据库,毕竟就算只使用自己计算机上的研发数据库,也不能保证数据正确性和完备性,毕竟自己经常会操作些垃圾数据. 这个时候就需要模拟一个“数据库”来构造我们想要的一些数据.这个就是Mock…
开篇:最近在看Roy Osherove的<单元测试的艺术>一书,颇有收获.因此,将其记录下来,并分为四个部分分享成文,与各位Share.本篇作为入门,介绍了单元测试的基础知识,例如:如何使用一个测试框架,基本的自动化测试属性等等,还有对应的三种测试类型.相信你可以对编写单元测试从一无所知到及格水平,这也是原书作者的目标. 系列目录: 1.入门 2.核心技术 3.测试代码 一.单元测试基础 1.1 什么是单元测试 一个单元测试是一段自动化的代码,这段代码调用被测试的工作单元,之后对这个单元的单个…
开篇:上一篇我们学习单元测试和核心技术:存根.模拟对象和隔离框架,它们是我们进行高质量单元测试的技术基础.本篇会集中在管理和组织单元测试的技术,以及如何确保在真实项目中进行高质量的单元测试. 系列目录: 1.入门 2.核心技术 3.测试代码 一.测试层次和组织 1.1 测试项目的两种目录结构 (1)集成测试和单元测试在同一个项目里,但放在不同的目录和命名空间里.基础类放在单独的文件夹里. (2)集成测试和单元测试位于不同的项目中,有不同的命名空间. 实践中推荐使用第二种目录结构,因为如果我们不把…
以下内容为原创,欢迎转载,转载请注明 来自天天博客:http://www.cnblogs.com/tiantianbyconan/p/5422443.html Android MVP&依赖注入&单元测试 注意:为了区分MVP中的View与Android中控件的View,以下MVP中的View使用Viewer来表示. 这里暂时先只讨论 Viewer 和 Presenter,Model暂时不去涉及. 1.1 MVP 基础框架 1.1.1 前提 首先需要解决以下问题: MVP中把Layout布局…
Spring的依赖注入是指将对象的创建权交给Spring框架,将对象所依赖的属性注入进来的行为.在学习了dom4j后,其实也可以利用dom4j和反射做一个小Demo模拟Spring框架的这种功能.下面是具体的步骤: 第一步,编写配置文件.配置文件的书写,采用了和Spring的配置文件applicationContext.xml一样的书写规则: <?xml version="1.0" encoding="UTF-8"?> <!-- applicati…
单元测试是独立的,所谓的独立是指有独立的运行容器,独立的数据库. 这样做有什么好处呢? (1). 不会跟正常的容器产生冲突,继而影响正常业务. (2). 数据库独立防止数据被修改影响单元测试结果. 这两天攻克了单元测试的两个问题:模拟数据库.mockery的调用.现在把原理解析一下. 1. 模拟数据库 那这样,我们来想一下.正常的创建一个数据库要有那些流程? (1)定义表结构 (2)往表中插入数据 其实测试使用的模拟数据库总的来说也就这两个流程. 来来来,敲黑板,重点来了. database目录…
在 Laravel 编写单元测试时经常会遇到需要模拟认证用户的时候,比如新建文章.创建订单等,那么在 Laravel unit test 中如何来实现呢? 官方解决方法 Laravel 的官方文档中的测试章节中有提到: Of course, one common use of the session is for maintaining state for the authenticated user. The actingAs helper method provides a simple w…