原文:解剖SQLSERVER 第六篇 对OrcaMDF的系统测试里避免regressions(译)

解剖SQLSERVER 第六篇  对OrcaMDF的系统测试里避免regressions (译)

http://improve.dk/avoiding-regressions-in-orcamdf-by-system-testing/

当我继续添加新功能和新的数据结构支持进去OrcaMDF软件的时候,bug的风险不断增加

特别是当我开发一个很大的未知功能时,我不能预估结构和该结构的关联,为了降低风险,测试是很有必要的

单元测试

单元测试是在面向对象编程里测试源代码某一个功能的最小一部分的测试。一个测试的例子是SqlBigInt数据类型解析类,

他应该长这个样子

using System;
using NUnit.Framework;
using OrcaMDF.Core.Engine.SqlTypes;namespace OrcaMDF.Core.Tests.Engine.SqlTypes
{[TestFixture]public class SqlBigIntTests{[Test]public void GetValue(){var type = new SqlBigInt();byte[] input;input = new byte[] { 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x7F };Assert.AreEqual(9223372036854775807, Convert.ToInt64(type.GetValue(input)));input = new byte[] { 0x82, 0x5A, 0x03, 0x1B, 0xD5, 0x3E, 0xCD, 0x71 };Assert.AreEqual(8200279581513702018, Convert.ToInt64(type.GetValue(input)));input = new byte[] { 0x7F, 0xA5, 0xFC, 0xE4, 0x2A, 0xC1, 0x32, 0x8E };Assert.AreEqual(-8200279581513702017, Convert.ToInt64(type.GetValue(input)));}[Test]public void Length(){var type = new SqlBigInt();Assert.Throws<ArgumentException>(() => type.GetValue(new byte[9]));Assert.Throws<ArgumentException>(() => type.GetValue(new byte[7]));}}
}

这个测试包含了SqlBigInt 类的主入口点,测试long bigint 数据类型是否会造成上溢或下溢的情况,也包含长度检查。

对于像SqlBigInt这样简单的类型单元测试会工作得很好。有时候单元测试会很复杂当相关联的类需要调用相应方法,类等支持他运行的底层结构的时候(mock测试)

虽然这是一个工作策略,测试需要不断进行,特别在项目早期阶段,整个架构都是动态的

系统测试

在测试范围上,我们需要更大的范围测试 -系统测试。系统测试旨在测试系统作为一个整体,基本上忽略系统内部工作原理

如果要分类的话可以被分为 黑盒测试。对于OrcaMDF,我估计可以捕获90%的所有的regressions 只使用10%的时间,

相比起单元测试使用更多时间只捕获少量的regressions 。

因此,这是一个很好的方法在开发期间的测试,同时可以引入关键的单元测试和集成测试。

例如我想测试DatabaseMetaData 类里面的用户表名字的解析,我可以模拟SysObjects的值列表,同时对于DatabaseMetaData 类

的构造函数也能模拟MdfFile 所必须的参数,为了做到这一点,我必须从MdfFile 提取出一个接口并且在上面使用mocking framework

系统测试的方法执行以下流程:

1、连接到SQLSERVER实例

2、在测试固件(Test fixture)里创建测试架构

3、分离数据库

4、运行OrcaMDF 并加载分离的数据库验证结果

一个测试样例,创建两个用户表并且验证DatabaseMetaData类的输出

using System.Data.SqlClient;
using NUnit.Framework;
using OrcaMDF.Core.Engine;namespace OrcaMDF.Core.Tests.Integration
{public class ParseUserTableNames : SqlServerSystemTest{[Test]public void ParseTableNames(){using(var mdf = new MdfFile(MdfPath)){var metaData = mdf.GetMetaData();Assert.AreEqual(2, metaData.UserTableNames.Length);Assert.AreEqual("MyTable", metaData.UserTableNames[0]);Assert.AreEqual("XYZ", metaData.UserTableNames[1]);}}protected override void RunSetupQueries(SqlConnection conn){var cmd = new SqlCommand(@"CREATE TABLE MyTable (ID int);CREATE TABLE XYZ (ID int);", conn);cmd.ExecuteNonQuery();}}
}

在实际的真实生活场景里这样可以非常快速的进行测试。想测试转发记录的解析?只需要简单地创建一个新的测试
编写TSQL代码来生成目标数据库状态然后验证扫描到的表数据

系统测试的缺点

不幸的是系统测试不是万能药,它也有它的缺点。最明显的一个缺点是性能。

单元测试通常需要运行非常快,基本上允许您在每个文件保存后在后台运行它们。从绑定CPU开始到运行 ,每一个这样的系统测试都需要半秒

幸运的是,它们可以并行运行没有问题。在一台四核的机器能让我每分钟运行480个测试。这能够让一个完整的测试集合控制在合理的时间,

同时依然保持测试子集能够很快运行。通常代码的更改不会对测试造成太多的影响

第六篇完

解剖SQLSERVER 第六篇 对OrcaMDF的系统测试里避免regressions(译)相关推荐

  1. 解剖SQLSERVER 第十七篇 使用 OrcaMDF Corruptor 故意损坏数据库(译)

    解剖SQLSERVER 第十七篇 使用 OrcaMDF Corruptor 故意损坏数据库(译) http://improve.dk/corrupting-databases-purpose-usin ...

  2. 解剖SQLSERVER 第十篇 OrcaMDF Studio 发布+ 特性重温(译)

    解剖SQLSERVER 第十篇  OrcaMDF Studio 发布+ 特性重温(译) http://improve.dk/orcamdf-studio-release-feature-recap/ ...

  3. 解剖SQLSERVER 第四篇 OrcaMDF里对dates类型数据的解析(译)

    解剖SQLSERVER 第四篇  OrcaMDF里对dates类型数据的解析(译) http://improve.dk/parsing-dates-in-orcamdf/ 在SQLSERVER里面有几 ...

  4. 解剖SQLSERVER 第八篇 OrcaMDF 现在支持多数据文件的数据库(译)

    原文:解剖SQLSERVER 第八篇 OrcaMDF 现在支持多数据文件的数据库(译) 解剖SQLSERVER 第八篇  OrcaMDF 现在支持多数据文件的数据库(译) http://improve ...

  5. 解剖SQLSERVER 第十一篇 对SQLSERVER的多个版本进行自动化测试(译)

    原文:解剖SQLSERVER 第十一篇 对SQLSERVER的多个版本进行自动化测试(译) 解剖SQLSERVER 第十一篇    对SQLSERVER的多个版本进行自动化测试(译) http://i ...

  6. 成人高考 计算机英语作文,2018年成人高考英语作文范文六篇

    [导语]成人高考是成人高等学校招生统一考试的简称,属国民教育系列,国家承认学历,参加全国招生统一考试,各省.自治区.直辖市统一组织录取.无忧考网为了帮助同学们更好的备考,特别整理了成人高考英语作文范文 ...

  7. NeurIPS 2021六篇杰出论文公布,谷歌工程师11年前论文获时间检验奖

    来源:量子位 NeurIPS 2021将于下周正式召开. 近日,大会委员会公布了NeurIPS 2021的杰出论文奖,时间测试奖,以及今年新设的数据集和测试基准最佳论文奖. 杰出论文奖 今年有六篇论文 ...

  8. 一年六篇顶会的清华大神提出Fastformer:史上最快、效果最好的Transformer

    来源:新智元 [导读]Transformer模型好是好,可惜太慢了!最近一位清华大神在arxiv上传了一篇论文,提出新模型Fastformer,线性时间复杂度,训练和推理效率史上最快,还顺手在排行榜刷 ...

  9. 计算机网络教室课程安排表,关于计算机教学计划汇总六篇

    关于计算机教学计划汇总六篇 时光飞逝,时间在慢慢推演,我们又将奔赴下一阶段的教学,我们要好好计划今后的教育教学方法.是不是无从下笔.没有头绪?以下是小编收集整理的计算机教学计划9篇,欢迎阅读与收藏. ...

最新文章

  1. 【FPGA】Spartan-6的时钟管理器(CMT)
  2. import是引进外部函数吗_你必须要知道的Python中的main函数
  3. 技术干货 | JavaScript 之事件循环(Event Loop)
  4. PHP--TP开发模式
  5. Exchange与ADFS单点登录 PART 3:部署和配置WAP
  6. 没有人能阻止程序员将电脑上的一切搬到网页上
  7. WeChatTweak-微信小助手安装教程
  8. 百度昆仑AI芯片已完成研发:明年初量产 由三星代工
  9. vSAN 内存或 SSD 拥堵已达到阈值限制 (2071384)
  10. JavaScript笔记 03:数组
  11. Python Tox 使用笔记
  12. google退出中国声明原文【翻译版】
  13. windows10网速监控(netspeedmonitor)
  14. 应付一天(今天太累)附新东方考研5500词音频
  15. CollaNote - 完全免费无广告的 iPad / iPhone 手写笔记应用(Notability / GoodNotes 的免费替代品)
  16. Vue响应式原理详细讲解
  17. 【读懂Autosar代码】-6-Function函数的定义
  18. 微信、小程序、h5等实名认证接口
  19. 这可能是你见过的最全的SaaS行业分析
  20. 麦肯锡解决问题的7个步骤

热门文章

  1. [读书笔记] 设计模式与游戏完美开发
  2. 减治法在生成子集问题中的应用(JAVA)--递归、二进制反射格雷码
  3. JSP调用request方法获取请求相关信息
  4. oracle近三个月内,在oracle中的前三个月SQL
  5. 5b计算机联锁系统_力控科技油库调度管理系统应用案例
  6. kettle连接mysql教程_kettle 连接 mysql8
  7. java date.from_java datefromat
  8. 互联网晚报 | 9月2日 星期四 | 小米汽车有限公司正式成立;唯品富邦消费金融获批开业;恒大举行保交楼军令状签署大会...
  9. 互联网日报 | 6月7日 星期一 | 华为已捐献鸿蒙全部基础能力;芝麻信用7年免押金4000亿;奈雪的茶通过港交所上市聆讯...
  10. 2021年看得见的粉丝价值——五大平台KOL粉丝分析研究报告