精华内容
下载资源
问答
  • 人教版化学高二选修2第一单元课题1化工生产中的基本问题同步练习-.pdf
  • 2013年高中化学 第一单元 课题1化工生产过程中的基本问题精品课件 新人教版选修2
  • 高中化学第一单元走进化学工业课题1化学生产过程中的基本问题作业新人教版选修2
  • 2018秋高中政治第二单元生产劳动与经营第四课生产与经济制度第二框我国的基本经济制度检测新人教版必修1
  • 人教版化学高二选修2第一单元课题1化工生产中的基本问题同步练习D卷.pdf
  • 人教版化学高二选修2第一单元课题1化工生产中的基本问题同步练习C卷.pdf
  • 高中化学第一单元走进化学工业课题1化学生产过程中的基本问题2作业新人教版选修2
  • 高中化学第一单元走进化学工业课题1化学生产过程中的基本问题1作业新人教版选修2
  • 五年级数学下册第四单元生产中的数学__比例比例的意义和基本性质教案青岛版20200407323
  • 2016春青岛版数学六下第三单元《啤酒生产中的数学》(比例的基本性质)ppt课件
  • 五年级数学下册 第四单元啤酒生产中的数学——比例 比例的意义和基本性质教案 青岛版 教案.doc
  • 六年级数学下册第三单元生产中的数学__比例运输大麦芽__比例的意义和基本性质解比例作业pdf无答案青岛版六三制
  • 模块化生产加工系统的供料单元的编程与实现研究,李萍,李文斌,针对模块化生产系统供料单元的系统结构和工艺流程,利用Step7软件作为S7-300编程的基本环境,采用S7-Graph编程语言对供料单元结构化编�
  • 【C#】单元测试及NUnit的基本用法

    千次阅读 2019-05-28 23:24:33
    单元测试 单元测试(Unit Testing)是针对程序弄块(软件设计的最小单位)来进行正确性检验的测试工作。单元测试通常由软件开发人员编写,用于确保他们了所写的代码匹配软件需求和遵循开发目标。 单元测试的优点: ...

    单元测试

    单元测试(Unit Testing)是针对程序弄块(软件设计的最小单位)来进行正确性检验的测试工作。单元测试通常由软件开发人员编写,用于确保他们了所写的代码匹配软件需求和遵循开发目标。

    单元测试的优点:

    1. 适应变更。允许程序员在未来重构代码,并确保模块依然工作正确。
    2. 简化集成。采用自底向上的测试路径,消除程序单元的不可靠,使集成测试变得更简单。
    3. 文档记录。借助于查看单元测试提供的功能和单元测试中如何使用程序单元,开发人员可以直观的理解程序单元的基础API。
    4. 表达设计。在测试驱动开发的软件实践中,单元测试可以取代正式的设计。开发人员编写单元测试用于展示软件需求或者软件缺陷,然后,开发人员遵循测试要求编写最简单的代码去满足它,直到测试得以通过。

    NUnit测试框架

    .Net平台下有多种测试工具,NUnit为C#开发的开源测试框架,广泛用于.Net平台的单元测试和回归测试中。

    详细的使用方法可以参考:https://github.com/nunit/docs/wiki

    下面介绍在Visual Studio中的最轻量级的使用方法。

    1.安装

    在Visual Studio菜单栏 “工具——>扩展和更新——>联机”,搜索“nunit”,结果如下。安装NUnit 3 Test AdapterNUnit VS TemplatesTest Generator NUnit extension三个扩展。
    在这里插入图片描述

    2.创建测试项目

    一开始需要在已有的解决方案中创建新的测试项目,因为不想把任何测试与生产的代码一起发布。菜单栏点击“文件 ——> 添加 ——> 新建项目 ——> Visual C# ——> 测试”。

    在项目的引用栏中添加nunit.framework引用。

    以类为单位创建测试文件,对于MVP的设计模式,可以对View的接口进行Mock,可以参考教程An Introduction to testing with the Model-View-Presenter pattern for Web Forms Development

    典型的测试文件格式如下所示。

    namespace JMelt.Tests
    {
        using JMelt.Models;
    
        [TestFixture]
        public class TestMyCustom
        {
            [SetUp]
            public void Initialize()
            {
                //这里写运行每一个测试用例时需要初始化的代码
            }
    
            /// <summary>
            /// 测试 custom.ini 配置信息的读取
            /// </summary>
            [Test]
            public void TestReadIniFile()
            {
                var length = MyCustom.CustomConfig.Count;
                Assert.That(length, Is.EqualTo(10), "custom.ini read error");
            }
    

    属性解释:

    [TestFixture]: 标识测试类。
    [SetUp]: 标识测试用例初始化函数,每个测试用例运行都会执行一次。
    [Test]: 标识测试用例。
    [TearDown]: 标识测试用例资源释放函数。

    3.运行测试

    在菜单栏打开“测试 ——> 窗口 ——> 测试资源管理器”,在测试资源管理器中可以运行所有的测试用例。

    参考资料

    1. https://zh.wikipedia.org/wiki/单元测试
    2. https://www.cnblogs.com/zwt-blog/p/5788222.html
    3. http://www.51testing.com/html/54/n-3725154.html
    4. https://github.com/nunit/docs/wiki/NUnit-Documentation
    展开全文
  • 软件测试系列之单元测试(1 基本理论) 整理资料时发现以前给兄弟们灌输的单元测试的一些基本知识,放在这里供大家参考。里面参考了网上很多朋友的资料,这里没一一列出,一并谢过。ppt转的,比较乱,ppt已经上传到...

    软件测试系列之单元测试(1 基本理论)

     

    整理资料时发现以前给兄弟们灌输的单元测试的一些基本知识,放在这里供大家参考。里面参考了网上很多朋友的资料,这里没一一列出,一并谢过。ppt转的,比较乱,ppt已经上传到个人资源的,需要的可以去下载看看。不知道怎么搞的,ppt转成word格式是正确的,word里粘贴到这里,在编辑方式下也是对的,可是浏览文章时就乱七八糟了。只有在记事本里中转了一下,丧失了很多排版上的信息。


    现象
    ? 投入太多的精力,找 bug,而新的代码仍然会出现类似 bug;
    ? 写完代码,心里没底,是否有大量 bug 等待自己;
    ? 新修改的代码不知道是否影响其他部分代码;
    ? 由于牵扯太多,导致不敢进行修改代码;
    ...


    一、软件测试基本理论
    ? 目的:对软件测试有个整体认识
    ? 软件测试
    ? 软件测试分类
    ? 软件开发全过程检测及测试自动化
    ? V模型与X模型
    ? TDD( Test-Driven Development)
    什么是软件测试?
     在软件投入运行前,对软件需求分析、设计规格说明和编码的最终复审,是软件质量保证的关键步骤。
     软件测试的概念:
         软件测试是为了发现错误而执行程序的过程。
     或者说,软件测试是根据软件开发各个阶段的规格说明和程序的内部结构而精心设计一批测试用例(即输入数据及其预期结果),并利用这些测试用例去执行程序,以发现程序错误的过程。

    测试的目的
    ? 测试是程序的执行过程,目的在于发现错误;
    ? 一个好的测试用例在于能发现至今未发现的错误;
    ? 一个成功的测试是发现了至今未发现的错误的测试
    ? 也可以这样说,测试的目标是以较少的用例、时间和人力找出软件中潜在的各种错误和缺陷,以确保系统的质量
    ? 一个被人忽略的软件测试目的是:测试可以帮助发现当前开发工作所采用的软件过程(也是一个“软件”)的缺陷,以便进行改进。
    ? 首先,测试并不仅仅是为了要找出错误。分析错误产生的原因和错误在开发的哪一个阶段产生,具有非常重要的意义。
    ? 通过分析错误产生于哪一个开发阶段、而又在哪一个阶段被发现,我们可以判断从错误的产生到错误的发现,跨越了多少个开发阶段。
    ? 软件开发的一条重要原则是尽早发现与修正错误。
    ? 正确分析与利用测试的结果,我们可以非常有效地进行软件过程改进
    软件测试原则 2-1
    ? 完全测试程序是不可能的
           -输入量太大
            -输出结果太多
            -软件实现途径太多
            -软件说明书没有客观标准。从不同角度看,软件缺陷的标准不同。
    软件测试原则 2-2
    ?  软件测试是有风险的行为
    ?  测试无法显示潜伏的软件缺陷
    ? 找到的软件缺陷越多,就说明软件缺陷越多
    ?  并非所有软件缺陷都能修复
    ? 软件测试一项讲究条理的技术专业
    软件测试分类
    从是否需要执行被测软件的角度,可分为:
    -静态测试
    -动态测试

    从测试是否针对系统的内部结构和具体实现算法的角度来看,可分为 :
    -白盒测试
    -黑盒测试

    软件测试方法-静态和动态
    ? 静态检查
    ? 确保系统按照组织的标准和过程运行,主要依赖于评审和非运行的手段来检查。通常包括需求评审、设计评审、代码走查和代码检查。
    ? 动态检查
    ? 在生命周期中进行测试(运行)。通常包括单元测试、集成测试、系统测试、用户的验收测试。

    静态测试
    ? 审查 (Inspection)
          -软件的一种基本测试方法,它以一系列典型问题为依据进行检测。
    ? 走查 (Walkthrough)
           -一对一的审查,比审查更加仔细。
    ? 回顾(Review)
            -以发现软件中存在的错误和缺陷为目的的一种软件测试方法,它是在软件证实执行之前完成。

    静态和动态测试进行结构和功能测试
    测试技术
    黑盒测试

     黑盒测试也称功能测试或数据驱动测试,它是在已知产品所应具有的功能,通过测试来检测每个功能是否都能正常使用,在测试时,把程序看作一个不能打开的黑盆子,在完全不考虑程序内部结构和内部特性的情况下,测试者在程序接口进行测试,它只检查程序功能是否按照需求规格说明书的规定正常使用,程序是否能适当地接收输入数锯而产生正确的输出信息,并且保持外部信息(如数据库或文件)的完整性。

          “黑盒”测试着眼于程序外部结构、不考虑内部逻辑结构、针对软件界面和软件功能进行测试。“黑盒”法是穷举输入测试,只有把所有可能的输入都作为测试情况使用,才能以这种方法查出程序中所有的错误。实际上测试情况有无穷多个,人们不仅要测试所有合法的输入,而且还要对那些不合法但是可能的输入进行测试。
           它不仅应用于开发阶段的测试,更重要的是在产品测试阶段及维护阶段必不可少。主要用于软件确认测试。
        黑盒测试方法主要有:
    ?  等价类划分
    ?    边值分析
    ?  因果图
    ?  错误推测
        
    白盒测试
       白盒测试也称结构测试或逻辑驱动测试,它是知道产品内部工作过程,可通过测试来检测产品内部动作是否按照规格说明书的规定正常进行,按照程序内部的结构测试程序,检验程序中的每条通路是否都有能按预定要求正确工作,而不顾它的功能。
      使用被测单元内部如何工作的信息,允许测试人员对程序内部逻辑结构及有关信息来设计和选择测试用例,对程序的逻辑路径进行测试。基于一个应用代码的内部逻辑知识,测试是基于覆盖全部代码、分支、路径、条件。
    白盒测试的主要方法
    ? 逻辑驱动测试
    ? 基本路径测试
          
         主要用于软件验证。
         使用程序设计的控制结构导出测试用例。

     逻辑驱动测试:
     主要是测试覆盖率,以程序内在逻辑结构为基础的测试。包括以下6种类型:
    ? 语句覆盖
    ? 判断覆盖
    ? 条件覆盖
    ? 判定-条件覆盖
    ? 条件组合覆盖
    ? 路径测试
    白盒测试的主要目的
    ? 保证一个模块中的所有独立路径至少被执行一次;
    ? 对所有的逻辑值均需要测试真、假两个分支;
    ? 在上下边界及可操作范围内运行所有循环;
    ? 检查内部数据结构以确保其有效性。
    概念

    ? 语句覆盖:语句覆盖就是设计若干个测试用例,运行被测试程序,使得每一条可执行语句至少执行一次;
    ? 判定覆盖(也称为分支覆盖):设计若干个测试用例,运行所测程序,使程序中每个判断的取真分支和取假分支至少执行一次;
    ? 条件覆盖:设计足够多的测试用例,运行所测程序,使程序中每个判断的每个条件的每个可能取值至少执行一次;
    ? 判定-条件覆盖:设计足够多的测试用例,运行所测程序,使程序中每个判断的每个条件的所有可能取值至少执行一次,并且每个可能的判断结果也至少执行一次,换句话说,即是要求各个判断的所有可能的条件取值组合至少执行一次;
    ? 条件组合测试:设计足够多的测试用例,运行所测程序,使程序中每个判断的所有可能的条件取值组合至少执行一次;
    ? 路径测试:设计足够多的测试用例,运行所测程序,要覆盖程序中所有可能的路径。
    软件开发全过程检测及测试自动化
    ? 单元测试(unit test )
      由编程的开发人员自行计划与完成的,针对单个或相关联的一组程序单元的测试。 
    ? 组装测试(inegration test )
      计划于设计阶段,由开发人员与测试人员合作完成的,针对结合起来的不同单元以及它们的接口的测试。
    ? 系统测试(system test ):(可认为包括“可用性与图形用户界面测试”)
      测试整个系统,以证实它满足要求所规定的功能、质量和性能等方面的特性。 
    ? 回归测试(regression test ):
      用于验证改变了的系统或其组件仍然保持应有的特性。 
    ? 验收测试(acceptance test ):
      测试整个系统,以保证其达到可以交付使用的状态。

     


    V模型
    V模型
    ? 单元测试、集成测试、系统测试、验收测试。是“从小到大”、“由内至外”、“循序渐进”的测试过程,体现了“分而治之”的思想。
    ? 单元测试的粒度最小,一般由开发小组采用白盒方式来测试,主要测试单元是否符合“设计”。
    ? 集成测试界于单元测试和系统测试之间,起到“桥梁作用”,一般由开发小组采用白盒加黑盒的方式来测试,既要验证“设计”又要验证“需求”。
    V模型
    ? 系统测试的粒度最大,一般由独立测试小组采用黑盒方式来测试,主要测试系统是否符合“需求规格说明书”。
    ? 验收测试与系统测试非常相似,主要区别是测试人员不同,验收测试由用户执行。


    测试内容
    ? 测试内容一般包含
    ? 接口与路径测试。
    ? 功能测试、健壮性测试、性能测试、用户界面测试、安全性测试、压力测试、可靠性测试、安装/反安装测试…
    测试阶段对应表
    接口与路径测试 3-1
    ? 接口测试:数据一般通过接口输入和输出,接口测试一般是白盒测试的第一步。
    ―  输入参数有“典型值”、“边界值”、“异常值”
    ―  输出包括函数的返回值和输出参数。
    ―  实际输出与期望的输出不一致,那么说明程序有错误。
    ? 一个函数体内的语句可能只有十几条,但逻辑路径可能有成千上万条。所以应该根据经验选择关键的路径测试。
    接口与路径测试 3-2
    ? 路径测试的检查表
    ? -数据类型、变量值、逻辑判断、循环、内存管理、文件I/O、错误处理 
    ? 预防一些重要的路径没有被测试的措施有:
    ― 观察是否有程序语句从来没有被执行过。
    ― 要特别留意函数体内的错误处理程序块。

    接口与路径测试 3-3
    ? 接口与路径测试用例的参考模板
    功能测试 3-1
    ? 功能测试的基本方法是构造一些合理输入(在需求范围之内),检查输出是否与期望的相同。如果两者不一致,即表明功能有误。
    ? 难点在于如何构造有效的输入。
    功能测试 3-2
    ? 功能测试的测试方法:等价划分法和边界值分析法。
    ― 等价划分是指把输入空间划分为几个“等价区间”,在每个“等价区间”中只需要测试一个典型值就可以了。等价划分法来源于人们的直觉与经验,可令测试事半功倍。
    ― “缺陷遗漏在角落里,聚集在边界上”。边界值测试法是对等价划分法的补充。如果A和B是输入空间的边界值,那么除了典型值外还要用A和B作为测试用例。

    功能测试 3-3
    ? 功能测试用例的参考模板
    性能测试 3-1
    ? 性能测试即测试软件处理事务的速度,一是为了检验性能是否符合需求,二是为了得到某些性能数据供人们参考。
    ? 绝对值考虑:如数据送输速率是每秒多少比特。 “相对值”考虑:如某个软件比另一个软件快多少倍。
    ? 性能测试中考虑运行环境的影响:例如网络环境、计算机主频,总线结构和外部设备都可能影响软件的运行速度。
    性能测试  3-2
    ? 性能测试的一些注意事项:
    ― 应当编写一段程序用于计算时间以及相关数据。
    ― 应当测试软件在标准配置和最低配置下的性能。
    ― 应当关闭那些消耗内存、占用CPU的其它应用软件(如杀毒软件)。
    ― 应当分档记录。例如传输文件的容量从100K到1M可以分成若干等级。
    ― 同一种输入情况在不同的时间可能得到不同的性能数据,可以取其平均值。


    性能测试 3-3
    ? 性能测试用例的参考模板
    压力测试  2-1
    ? 压力测试也叫负荷测试,即获取系统能正常运行的极限状态。
    ? 压力测试的主要任务是:构造正确的输入,使劲折腾系统却让它刚好不瘫痪。
    ? 压力测试的一个变种是敏感测试。在某种情况下,微小的输入变动会导致系统的表现(如性能)发生急剧的变化。
    压力测试  2-2
    ? 压力测试用例的参考模板

    其他测试内容
    ? 健壮性测试
    ? 用户界面测试
    ? 信息安全测试
    ? 可靠性测试
    ? 安装和反安装测试

    测试常见问题 2-1
    ? 问题1:有了“黑盒”测试为什么还要“白盒”测试?
    ? 问题2:由于单元测试要写测试驱动程序,非常麻烦,能否等到整个系统全部开发完后,再集中精力进行一次性地单元测试呢?
    ? 问题3:如果每个单元都通过了测试,把它们集成一起难道会有什么不妥吗?集成测试是否多此一举?
    测试常见问题 2-2
    ? 问题4:在集成测试的时候,已经对一些子系统进行了功能测试、性能测试等等,那么在系统测试时能否跳过相同内容的测试?
    ? 问题5:既然系统测试与验收测试的内容几乎是相同的,为什么还要验收测试?
    ? 问题6:能否将系统测试和验收测试“合二为一”?
    总结 2-1
    ? 测试可以将测试描述为一个运行程序以发现错误的过程。
    ? 软件测试的准则:不完全测试、风险测试、无法显示潜伏错误、发现错误成线性增长、缺陷不能完全修复、测试有条理规程
    ? 测试的方法:黑盒/白盒、静态/动态
    ? 软件测试的各个阶段:单元测试、集成测试、系统测试、验收测试

    总结 2-2
    ? 测试的内容包括:接口/路径测试、功能测试、性能测试、压力测试、可靠性测试、安全性测试、用户界面测试、安装/反安装测试
    X模型
    测试驱动开发
    ? TDD, Test-Driven Development
    ? 测试驱动开发以测试作为开发过程的中心,它要求在编写任何代码之前,首先编写用于定义产品代码行为的测试,而编写的产品代码又以使测试通过为目标。测试驱动开发要求测试可以完全自动地运行,在代码进行重构前必须运行测试。
    TDD基本做法
    ?   1. 写一个测试程序。
    ?   2. 让程序编译通过。
    ?   3. 运行测试程序,发现不能运行。
    ?   4. 让测试程序可以运行。
    ?   5. 消除重复设计,优化设计结构。

    测试产品说明书
    ? 对于产品说明书的制定是个很重要的设计阶段,产品说明书的质量会直接影响到整个产品开发。
    ? 测试产品说明书属于静态黑盒子测试。
    常用测试用语-测试用例
    ? 测试用例:编写用于输入输入的实际数制和预期结果。测试用例还明确指出使用具体测试用例产生的测试程序的任何限制 。
    ? 使用目的:
    ―  测试用例应该设计为能够快速容易地发现尽可能多的错误。
    ―  应该通过使用和产生正确和错误的输入和输出来“检验”程序。
    ―  其目标是要使用合理范围内的条件,尽可能全面地测试所有模块乃至整个系统。

    测试与调试-什么是缺陷
    ? 缺陷:最终产品同用户的期望不一致
    ? 缺陷的分类
    ? 错误
    ? 遗漏
    ? 超出需求的部分
    ? 缺陷(未触发)VS.错误(应首先解决)

    测试与调试-调试的准则
    ? 调试的方法:归纳法、演绎法和回溯法。
    ? 常用调试技术使用诊断输出语句 (diagnostic output statement)、快照转储 (snapshot dump) 以及跟踪指令的断点 (instruction-dependent breakpoint)。
    二、单元测试基本理论
    ? 什么是单元测试(Unit Test)
    ? 什么时候测试?
    ? 为什么要进行单元测试
    ? C/C++单元测试问答(摘要)
    单元测试(Unit Test)
    ? 工厂在组装一台电视机之前,会对每个元件都进行测试,这,就是单元测试。
    ? 临时单元测试:代码覆盖率要超过70%都很困难
    ? 充分的单元测试:提高软件质量,降低开发成本的必由之路。
    ? 单元测试是在软件开发过程中要进行的最低级别的测试活动,在单元测试活动中,软件的独立单元将在与程序的其他部分相隔离的情况下进行测试。
    单元测试(Unit Test)
    ? 对于程序员来说,如果养成了对自己写的代码进行单元测试的习惯,不但可以写出高质量的代码,而且还能提高编程水平。
    ? 在一种传统的结构化编程语言中,比如C,要进行测试的单元一般是函数或子过程。在象C++这样的面向对象的语言中,要进行测试的基本单元是类。对Ada语言来说,开发人员可以选择是在独立的过程和函数,还是在Ada包的级别上进行单元测试。单元测试的原则同样被扩展到第四代语言(4GL)的开发中,在这里基本单元被典型地划分为一个菜单或显示界面。
    单元测试(Unit Test)
    ? 单元测试不仅仅是作为无错编码一种辅助手段在一次性的开发过程中使用,单元测试必须是可重复的,无论是在软件修改,或是移植到新的运行环境的过程中。因此,所有的测试都必须在整个软件系统的生命周期中进行维护。
    三、为什么要 进行单元测试
    ? 一些流行的误解--反调论证
    ? 其他好处
    ? 单元测试的重要性

    反证1:单元测试浪费了太多的时间
    一旦编码完成,开发人员总是会迫切希望进行软件的集成工作,这样他们就能够看到实际的系统开始启动工作了。 这在外表上看来是一项明显的进步,而象单元测试这样的活动也许会被看作是通往这个阶段点的道路上的障碍, 推迟了对整个系统进行联调这种真正有意思的工作启动的时间。

    反证1:单元测试浪费了太多的时间
     在这种开发步骤中,真实意义上的进步被外表上的进步取代了。系统能够正常工作的可能性是很小的,更多的情况是充满了各式各样的Bug。在实践中,这样一种开发步骤常常会导致这样的结果:软件甚至无法运行。更进一步的结果是大量的时间将被花费在跟踪那些包含在独立单元里的简单的Bug上面,在个别情况下,这些Bug也许是琐碎和微不足道的,但是总的来说,他们会导致在软件集成为一个系统时增加额外的工期, 而且当这个系统投入使用时也无法确保它能够可靠运行。
    反证1:单元测试浪费了太多的时间
    ? 在实践工作中,进行了完整计划的单元测试和编写实际的代码所花费的精力大致上是相同的。一旦完成了这些单元测试工作,很多Bug将被纠正,在确信他们手头拥有稳定可靠的部件的情况下,开发人员能够进行更高效的系统集成工作。这才是真实意义上的进步,所以说完整计划下的单元测试是对时间的更高效的利用。而调试人员的不受控和散漫的工作方式只会花费更多的时间而取得很少的好处。
    ? 使用AdaTEST和Cantata这样的支持工具可以使单元测试更加简单和有效。但这不是必须的,单元测试即使是在没有工具支持的情况下也是一项非常有意义的活动。
    反证2:仅仅证明代码做了什么
     这是那些没有首先为每个单元编写一个详细的规格说明而直接跳到编码阶段的开发人员提出的一条普遍的抱怨, 当编码完成以后并且面临代码测试任务的时候,他们就阅读这些代码并找出它实际上做了什么,把他们的测试工作基于已经写好的代码的基础上。当然,他们无法证明任何事情。所有的这些测试工作能够表明的事情就是编译器工作正常。是的,他们也许能够抓住(希望能够)罕见的编译器Bug,但是他们能够做的仅仅是这些。

    反证2:仅仅证明代码做了什么
     如果他们首先写好一个详细的规格说明,测试能够以规格说明为基础。代码就能够针对它的规格说明,而不是针对自身进行测试。这样的测试仍然能够抓住编译器的Bug,同时也能找到更多的编码错误,甚至是一些规格说明中的错误。好的规格说明可以使测试的质量更高,所以最后的结论是高质量的测试需要高质量的规格说明。
    反证2:仅仅证明代码做了什么
     在实践中会出现这样的情况: 一个开发人员要面对测试一个单元时只给出单元的代码而没有规格说明这样吃力不讨好的任务。你怎样做才会有更多的收获,而不仅仅是发现编译器的Bug?第一步是理解这个单元原本要做什么, --- 不是它实际上做了什么。 比较有效的方法是倒推出一个概要的规格说明。这个过程的主要输入条件是要阅读那些程序代码和注释, 主要针对这个单元, 及调用它和被它调用的相关代码。画出流程图是非常有帮助的,你可以用手工或使用某种工具。 可以组织对这个概要规格说明的走读(Review),以确保对这个单元的说明没有基本的错误, 有了这种最小程度的代码深层说明,就可以用它来设计单元测试了。
    反证3:我是个很棒的程序员, 我是不是可以不进行单元测试?
    ? 在每个开发组织中都至少有一个这样的开发人员,他非常擅长于编程,他们开发的软件总是在第一时间就可以正常运行,因此不需要进行测试。你是否经常听到这样的借口?
    ?   在真实世界里,每个人都会犯错误。即使某个开发人员可以抱着这种态度在很少的一些简单的程序中应付过去。 但真正的软件系统是非常复杂的。真正的软件系统不可以寄希望于没有进行广泛的测试和Bug修改过程就可以正常工作。
    ?   编码不是一个可以一次性通过的过程。在真实世界中,软件产品必须进行维护以对操作需求的改变作出反应, 并且要对最初的开发工作遗留下来的Bug进行修改。你希望依靠那些原始作者进行修改吗? 这些制造出这些未经测试的原始代码的资深专家们还会继续在其他地方制造这样的代码。在开发人员做出修改后进行可重复的单元测试可以避免产生那些令人不快的负作用。
    反证4:不管怎样, 集成测试将会抓住所有的Bug ?
    ? 我们已经在前面的讨论中从一个侧面对这个问题进行了部分的阐述。这个论点不成立的原因在于规模越大的代码集成意味着复杂性就越高。如果软件的单元没有事先进行测试,开发人员很可能会花费大量的时间仅仅是为了使软件能够运行,而任何实际的测试方案都无法执行。
    ?   一旦软件可以运行了,开发人员又要面对这样的问题: 在考虑软件全局复杂性的前提下对每个单元进行全面的测试。 这是一件非常困难的事情,甚至在创造一种单元调用的测试条件的时候,要全面的考虑单元的被调用时的各种入口参数。在软件集成阶段,对单元功能全面测试的复杂程度远远的超过独立进行的单元测试过程。
    ?   最后的结果是测试将无法达到它所应该有的全面性。一些缺陷将被遗漏,并且很多Bug将被忽略过去。
    ?   让我们类比一下,假设我们要清洗一台已经完全装配好的食物加工机器!无论你喷了多少水和清洁剂,一些食物的小碎片还是会粘在机器的死角位置,只有任其腐烂并等待以后再想办法。但我们换个角度想想,如果这台机器是拆开的, 这些死角也许就不存在或者更容易接触到了,并且每一部分都可以毫不费力的进行清洗。
    反证5:它的成本效率不高
    ? 一个特定的开发组织或软件应用系统的测试水平取决于对那些未发现的Bug的潜在后果的重视程度。这种后果的严重程度可以从一个Bug引起的小小的不便到发生多次的死机的情况。这种后果可能常常会被软件的开发人员所忽视(但是用户可不会这样),这种情况会长期的损害这些向用户提交带有Bug的软件的开发组织的信誉,并且会导致对未来的市场产生负面的影响。相反地,一个可靠的软件系统的良好的声誉将有助于一个开发组织获取未来的市场。
    ?   很多研究成果表明,无论什么时候作出修改都要进行完整的回归测试,在生命周期中尽早地对软件产品进行测试将使效率和质量得到最好的保证。Bug发现的越晚,修改它所需的费用就越高,因此从经济角度来看, 应该尽可能早的查找和修改Bug。在修改费用变的过高之前,单元测试是一个在早期抓住Bug的机会。
    ?   相比后阶段的测试,单元测试的创建更简单,维护更容易,并且可以更方便的进行重复。从全程的费用来考虑, 相比起那些复杂且旷日持久的集成测试,或是不稳定的软件系统来说,单元测试所需的费用是很低的。
    反证5:它的成本效率不高
    ? 摘自<<实用软件度量>>(Capers Jones,McGraw-Hill 1991),它列出了准备测试,执行测试,和修改缺陷所花费的时间(以一个功能点为基准),这些数据显示单元测试的成本效率大约是集成测试的两倍 系统测试的三倍。
    反证5:它的成本效率不高
    ? (术语域测试(Field test)意思是在软件投入使用以后,针对某个领域所作的所有测试活动)
    ?   这个图表并不表示开发人员不应该进行后阶段的测试活动,这次测试活动仍然是必须的。它的真正意思是尽可能早的排除尽可能多的Bug可以减少后阶段测试的费用。
    ?   其他的一些图表显示高达50%的维护工作量被花在那些总是会有的Bug的修改上面。如果这些Bug在开发阶段被排除掉的话,这些工作量就可以节省下来。当考虑到软件维护费用可能会比最初的开发费用高出数倍的时候,这种潜在的对50%软件维护费用的节省将对整个软件生命周期费用产生重大的影响。
    反证 结论
    ? 经验表明一个尽责的单元测试方法将会在软件开发的某个阶段发现很多的Bug,并且修改它们的成本也很低。在软件开发的后期阶段,Bug的发现并修改将会变得更加困难,并要消耗大量的时间和开发费用。无论什么时候作出修改都要进行完整的回归测试,在生命周期中尽早地对软件产品进行测试将使效率和质量得到最好的保证。 在提供了经过测试的单元的情况下,系统集成过程将会大大地简化。开发人员可以将精力集中在单元之间的交互作用和全局的功能实现上,而不是陷入充满很多Bug的单元之中不能自拔。
    ? 使测试工作的效力发挥到最大化的关键在于选择正确的测试策略,这其中包含了完全的单元测试的概念,以及对测试过程的良好的管理,还有适当地使用象AdaTEST和Cantata这样的工具来支持测试过程。这些活动可以产生这样的结果:在花费更低的开发费用的情况下得到更稳定的软件。更进一步的好处是简化了维护过程并降低了生命周期的费用。有效的单元测试是推行全局质量文化的一部分,而这种质量文化将会为软件开发者带来无限的商机。
    其他好处 1:减少程序的Bug
    ? 要减少软件中的错误数目,方法之一就是拥有一个专业的测试组,其工作就是尽一切可能使软件崩溃。不幸的是,如果拥有测试组,那么即使是经验丰富的开发人员,也会倾向于花费较少的时间来保证代码的可靠性。
    ? 软件界有一句俗语:“开发人员不应该测试他们自己的代码”。这是因为开发人员对自己的代码了如指掌,他们很清楚如何采用适当的方法对代码进行测试。尽管这句俗语很有道理,但却忽略了非常重要的一点 - 如果开发人员不对自己的代码进行测试,又如何知道代码能否按照预期的方式运行?
    ? 简单说来,他们根本无从得知。开发人员编写那种运行不正常或只在某些情况下运行正常的代码是一个严重的问题。他们通常只测试代码能否在很少的情况下正常运行,而不是验证代码能够在所有情况下均正常运行。
    其他好处 2:提高开发速度
    ? 在实践工作中,进行了完整计划的单元测试和编写实际的代码所花费的精力大致上是相同的。一旦完成了这些单元测试工作,很多Bug将被纠正,在确信他们手头拥有稳定可靠的部件的情况下,开发人员能够进行更高效的系统集成工作。这才是真实意义上的进步,所以说完整计划下的单元测试是对时间的更高效的利用。而调试人员的不受控和散漫的工作方式只会花费更多的时间而取得很少的好处。
    ? 经验表明一个尽责的单元测试方法将会在软件开发的某个阶段发现很多的Bug,并且修改它们的成本也很低。在软件开发的后期阶段,Bug的发现并修改将会变得更加困难,并要消耗大量的时间和开发费用。无论什么时候作出修改都要进行完整的回归测试,在生命周期中尽早地对软件产品进行测试将使效率和质量得到最好的保证。 在提供了经过测试的单元的情况下,系统集成过程将会大大地简化。开发人员可以将精力集中在单元之间的交互作用和全局的功能实现上,而不是陷入充满很多Bug的单元之中不能自拔。
    其他好处 3:使程序代码更整洁,优化程序的设计
    ? 只有自动的单元测试程序失败时,我们才会去重写代码,在测试驱动开发中,要求我们对程序不停的重构,通过重构,我们可以优化程序的结构设计,消除程序中潜在的错误。同时,为了能够使自己的程序可以很方便的进行测试,开发人员就需要很好地考虑程序的设计,极限编程的方法说可以不需要设计就开始编码,但实际上,它在编写代码的过程中每时每刻都为了方便的进行和通过测试而在优化自己的设计。它实际上是把开始阶段很大很抽象的设计分散到你编写的每个方法中。因此他们会说好设计最后会自然而然的出现。
    其他好处 4:编写单元测试代码的过程实际上就是设计程序的过程
    ? 在编写单元测试代码时,我们实际上是在思考我们的程序根据预期会返回什么结果,它实际上就是程序设计的过程。而通过重构过程,我们可以对这些设计进行很好的优化。
    单元测试的重要性
    ? 单元测试是软件测试的基础,因此单元测试的效果会直接影响到软件的后期测试,最终在很大程度上影响到产品的质量。
    ? 时间方面
    ? 测试效果
    ? 测试成本
    ? 产品质量

    重要性 1:时间方面
    ? 如果认真的做好了单元测试,在系统集成联调时非常顺利,因此会节约很多时间,反之那些由于因为时间原因不做单元测试或随便做做的则在集成时总会遇到那些本应该在单元测试就能发现的问题,而这种问题在集成时遇到往往很难让开发人员预料到,最后在苦苦寻觅中才发现这是个很低级的错误而在悔恨自己时已经浪费了很多时间,这种时间上的浪费一点都不值得,正所谓得不偿失。

    重要性 2:测试效果
    ? 根据以往的测试经验来看,单元测试的效果是非常明显的,首先它是测试阶段的基础,做好了单元测试,在做后期的集成测试和系统测试时就很顺利。其次在单元测试过程中能发现一些很深层次的问题,同时还会发现一些很容易发现而在集成测试和系统测试很难发现的问题。再次单元测试关注的范围也特殊,它不仅仅是证明这些代码做了什么,最重要的是代码是如何做的,是否做了它该做的事情而没有做不该做的事情。

    重要性 3:测试成本
    ? 在单元测试时某些问题就很容易发现,如果在后期的测试中发现问题所花的成本将成倍数上升。比如在单元测试时发现1个问题需要1个小时,则在集成测试时发现该问题需要2个小时,在系统测试时发现则需要3个小时,同理还有定位问题和解决问题的费用也是成倍数上升的,这就是我们要尽可能早的排除尽可能多的bug来减少后期成本的因素之一。

    重要性 4:产品质量
    ? 单元测试的好与坏直接影响到产品的质量,可能就是由于代码中的某一个小错误就导致了整个产品的质量降低一个指标,或者导致更严重的后果,如果我们做好了单元测试这种情况是可以完全避免的。
    ? 综上所述,单元测试是构筑产品质量的基石,我们不要因为节约单元测试的时间不做单元测试或随便做而让我们在后期浪费太多的不值得的时间,我们也不愿意因为由于节约那些时间导致开发出来的整个产品失败或重来!

    四、 C/C++单元测试问答
    ? 为什么要进行单元测试?
    ? 由谁进行测试?开发部门还是测试部门?
    ? 由测试部门进行单元测试为什么成本昂贵?
    ? 由开发部门进行单元测试能保证测试效果吗?
    ? 边编码边测试会影响编码进度吗?
    ? 实施单元测试需要改变开发流程吗?
    ? 单元测试测试哪些代码?
    ? 实际工作中,单元测试能实现什么程度的测试覆盖?
    ? 单元测试如何改良项目代码的整体结构?
    ? 我希望依赖全自动的工具来完成单元测试,这一想法现实吗?
    ? 如果由开发部门实施单元测试,那么测试部门要做哪些工作?
    为什么要进行单元测试?
    ? 单元测试保证局部代码的质量
    ? 单元测试改良项目代码的整体结构
    ? 单元测试降低测试、维护升级的成本
    ? 单元测试使开发过程适应频繁变化的需求
    ? 单元测试有助于提升程序员的能力
    由谁进行测试?开发部门/测试部门?
    ? 应该由开发部门进行单元测试!
    ? 由测试部门进行单元测试的问题:代价高,人手不足,耽误了测试部门对其他测试的准备工作。
    ? 由开发部门进行单元测试的问题:担心影响开发进度,程序员不习惯做单元测试,测试自己编写的代码,难于保证测试的效果。
    ? 无论由哪个部门做单元测试,都要面对一些问题,但开发部门所面对的问题可以借助工具来解决,而由测试部门进行单元测试,要么无法真正实施,要么代价昂贵。
    由测试部门来单元测试成本昂贵?
    ? 需多次重复理解程序
    ? 反复沟通需要大量时间成本
    ? 不利于发挥单元测试对代码结构的约束机制
    ? 耽误测试部门对其他测试的准备工作
    ? 即使测试部门人手充裕,仅仅从效益来考虑,也不应该由测试部门进行单元测试。如果测试部门本来就人力不充裕(进行单元测试的人员需具备编码能力),勉强由测试部门进行单元测试,结果往往是----没有结果。

    由开发部门进行单元测试能保证测试效果吗?
    ? 程序员测试自己编写的代码,往往只考虑“正常状况”,这当然会影响测试效果。但如果所用的单元测试工具能够统计各种白盒覆盖率,就能检查测试效果。当然,只做到这一点还是不够的,因为白盒覆盖具有逾后逾难的特点,达到一定的覆盖率后,覆盖率的提升会很困难。如果测试工具功能足够强大,能提供工具帮助用户快速地设计测试用例,达到完整的白盒覆盖,那么测试效果就能得到完全的保证。
    ? 实际上,如果没有充分的统计数据,没有达到足够的测试完整性,那么由谁做单元测试,效果都不能保证。

    边编码边测试会影响编码进度吗?
    ? 传统的单元测试是很费时费力的工作,主要时间消耗在于:编写测试代码、设计测试用例,如果开发工具能自动生成测试代码,并且具有快速设计测试用例的功能,那么测试费时就很少;另一方面,如果测试工具还能提供数据,帮助程序员整理编程思路、快速发现错误,更高效地调试,那么就能大量提高开发效率,抵销测试所消耗的时间,不但不会影响编码进度,甚至加快编码进度。
    实施单元测试需要改变开发流程吗?
    ? 边开发边测试,单元测试是编码行为而不是测试行为,测试代码看作是项目代码的一部分,程序员提交产品代码时也要提交测试代码和测试报告,其他流程可以不作任何改变。
    ? 另一方面,在充分单元测试的基础上,由于具有高质量的局部代码,良好的整体代码结构,保证了代码的可扩展性和可复用性,同时,自动回归测试支持对代码的频繁修改而不用担心引入新的错误,因此,开发流程自然会变得敏捷,可以适应频繁变化的需求,使系统分析、架构设计和后期测试的压力减轻,自然而有效地改进了开发流程。

    单元测试测试哪些代码?
    ? 单元测试通常不测试很简单的代码,一般也不测试“边界代码”。很简单的代码容易理解,例如Get/Set函数,这里解释一下“边界代码”。“边界代码”是指用于与外部系统交互的代码,例如用于处理用户界面的代码。数据库、文件、网络都可以看作是外部系统,用于读写数据库或文件、或访问网络的代码也可以看作是“边界代码”,这类代码应该独立出来,可以进行单元测试,但对这些代码的单元测试通常不能自动验证预期输出,而是需要人工察看。编程时,不要把普通代码与“边界代码”混在一起,例如,不要把各种运算直接写在界面类中,做到了这一点,绝大多数代码都可以进行单元测试。
    实际工作中,单元测试能实现什么程度的测试覆盖?
    ? 单元测试的最低要求是100%语句覆盖,这个覆盖率还是不够的,最好实现多种覆盖的组全,比较理想的覆盖率组合是:100%的语句、条件、分支、路径覆盖,另外,测试工具最好还能自动生成边界测试用例捕捉未处理特殊输入形成的错误。在达到这种覆盖之后,残留的编码错误可以几乎说没有了(设计方面的错误除外,这些属于集成或系统测试的范畴)。
    单元测试如何改良项目代码的整体结构?
    ? 具有良好整体结构的代码,应该符合“低耦合”的特性,即具有“可测性”。测试不具有“可测性”的代码时一般会产生编译错误,或者需要打桩才能测试,从而将问题暴露出来。发现问题后,重构代码、消除不当耦合一般不难,这种简单的重构将有效地改良代码的整体结构。
    我希望依赖全自动的工具来完成单元测试,这一想法现实吗?
    ? 完全自动化是一个美妙的愿望,但由于单元测试的基本特性,完全自动化的单元测试是不现实的。
    ? 与其他不同,单元测试是“隔离”的测试,要求代码具有可测性,一个项目甚至一个文件中,难免会有些影响可测性的代码,编译到这些代码时常常会产生编译错误,因此,全自动的单元测试工具往往只能测试小部分代码,即使使用某种技术手段屏蔽掉编译错误,也得不偿失,因为同时也屏蔽掉了改良代码整体结构的宝贵机会。如果采用自底向上的方式,一个一个文件测试,测试一个文件前,先将该文件加入测试工程并编译,没有编译错误时再测试,这样可以及时发现并消除不当耦合,使代码具有可测性,这种非全自动的方式,可以测试绝大多数代码,也保证了代码具有良好的整体结构。
    ? 另一方面,主要由测试工具自动生成测试用例来进行测试往往没有实际意义,因为测试工具无法自动了解程序的功能,因此,自动测试用例通常只能发现异常之类的极端错误,大多数一般错误都是无法发现的。测试工具最重要的不是自动生成测试用例,而是能提供快速建立和编辑测试用例的工具。

    如果由开发部门实施单元测试,那么测试部门要做哪些工作?
    ? 推动、组织单元测试的实施。单元测试既然叫做“测试”,开发部门常常认识不到其重要性和必要性,需要由测试部门推动和协助组织实施。
    ? 制定单元测试规范,培训单元测试技术。
    ? 检查、审核单元测试结果,保证单元测试的有效性。
    五、单元测试工具
    ? 测试工具的分类和选择
    ? Parasoft
    ? Compuware
    ? Rational
    ? AutomatedQA AQTime
    ? xUnit系列
    ? Visual Studio 2005
    ? Visual Unit

    测试工具的分类和选择
    ? 白盒测试工具
    ? 静态测试工具
    ? 动态测试工具
    ? 黑盒测试工具
    ? 功能测试工具
    ? 性能测试工具
    ? 测试管理工具
    ? 其他测试工具
    ? 测试工具的选择

    白盒测试工具
    ? 白盒测试工具一般是针对代码进行测试,测试中发现的缺陷可以定位到代码级
    ? 静态测试工具直接对代码进行分析,不需要运行代码,也不需要对代码编译链接,生成可执行文件。静态测试工具一般是对代码进行语法扫描,找出不符合编码规范的地方,根据某种质量模型评价代码的质量,生成系统的调用关系图等。
    ? 动态测试工具与静态测试工具不同,动态测试工具的一般采用“插桩”的方式,向代码生成的可执行文件中插入一些监测代码,用来统计程序运行时的数据。其与静态测试工具最大的不同就是动态测试工具要求被测系统实际运行。
    黑盒测试工具
    ? 黑盒测试工具适用于黑盒测试的场合,黑盒测试工具包括功能测试工具和性能测试工具。
    ? 黑盒测试工具的一般原理是利用脚本的录制(Record)/回放(Playback),模拟用户的操作,然后将被测系统的输出记录下来同预先给定的标准结果比较。黑盒测试工具可以大大减轻黑盒测试的工作量,在迭代开发的过程中,能够很好地进行回归测试。
    ? 黑盒测试工具的代表有Rational公司的TeamTest、Robot,Compuware公司的QACenter,另外,专用于性能测试的工具包括有Radview公司的WebLoad、Microsoft公司的WebStress等工具。
    测试管理工具
    ? 测试管理工具用于对测试进行管理。
    ? 内容:对测试计划、测试用例、测试实施进行管理,对缺陷的跟踪管理。
    ? 测试管理工具的代表有Rational公司的Test Manager、Compureware公司的TrackRecord,Mercury的TestDirector和Quality Center等软件。
    测试工具的选择
    ? 功能
    ? 基本的功能
    ? 报表功能
    ? 测试工具的集成能力
    ? 操作系统和开发工具的兼容性
    ? 价格
    ? 连续性和一致性:
    ? 全盘考虑,分阶段、逐步的引入测试工具
    测试工具引入中的误区分析
    ? 没有考虑到公司的实际情况,盲目引入测试工具
     专题分析,引入哪些测试工具?
    ? 没有进行有效的测试工具的培训
     测试工具的培训是一个长期的过程
     系列的培训和交流
    ? 没有形成一个良好的使用测试工具的环境
     没有能够形成一种机制让测试工具真正能够发挥作用
    良好的测试工具使用环境
    ? 约束机制
    测试工具并不是策略
    ? 测试工具并不能教测试员如何测试。如果测试出现问题,则测试工具会加重问题。在实现测试过程自动化之前,应首先解决测试过程中的问题。
    ? 有些测试工具带有测试策略的建议。但是这种建议很少能够描述得很清楚,并不能针对具体情况,而且往往过于强调他们那种自动化测试的重要性。
    ? 工具是辅助性的,关键还是靠人的思想和行为!
    Parasoft
    ? Parasoft Jtest  代码分析和动态类、组件测试
    ? Parasoft C++Test代码分析和动态测试
    ? Parasoft .TEST代码分析和动态测试
    ? Parasoft Insure++ 实时性能监控以及分析优化
    ? Parasoft CodeWizard代码静态分析
    http://www.parasoft.com
    Parasoft Jtest
    ? 是第一个自动化Java单元测试工具。Jtest自动测试任何Java类或部件,而不需要您写一个测试用例、驱动程序或桩函数。只要点击一个按钮,Jtest自动测试代码构造(白盒测试)、测试代码功能性(黑盒测试)、维护代码完整性(回归测试)和静态分析(编程标准执行和指标度量)。不需要复杂的设置,Jtest能够立即使用并指出问题。如果您使用“按合同设计”技术在代码中加入描述信息,Jtest能够自动建立和执行测试用例验证一个类的功能是否符合其功能描述。
    ? Jcontract Java 实时性能监控以及分析优化

    Parasoft C++Test
    ? 单元测试和静态分析工具,自动测试C和C++类别、功能或组件,而无需编写单个测试实例、测试驱动程序或桩调用。只需点击按钮,C++Test即会采用业内编码标准执行代码的静态分析,测试代码构造(白盒测试),测试代码功能性(黑盒测试),并保持代码完整性(回归测试)。
    Parasoft .TEST
    ? 单元测试和静态分析工具,自动测试写在Microsoft?.NET框架的类别,而无需编写单个测试场景或桩调用。只需点击按钮,.TEST即会在.NET源代码上自动执行完整系列的静态和动态测试。.TEST RuleWizard性能通过图形化表达希望.TEST在自动编码标准执行过程中查找的模式,支持设计定制的编码标准。
    Parasoft Insure++
    ? 一个自动化的内存错误、内存泄漏的精确检测工具。Insure++能够可视化实时内存操作,准确检测出内存泄漏产生的根源。Insure++还能执行覆盖性分析,清楚地指示那些代码已经测试过。将Insure++集成到您的开发环境中,能够极大地减少调试时间并有效地防止错误。
    Parasoft CodeWizard
    ? 高级C/C++源代码分析工具,采用三百种以上行业相关的编码准则,自动识别编译器未检测到的危险的编码构造。CodeWizard可以容易地通过RuleWizard性能,创建新定制的准则,或者抑制用于定制分析的准则。日常使用CodeWizard,可简化代码检查,并使代码更具可读性和可维护性。
    Compuware白盒测试工具集
    http://www.compuware.com
    ? BoundsChecker  C++,Delphi API和OLE错误检查、指针和泄露错误检查、内存错误检查
    ? TrueTime   C++ ,Java,Visual Basic 代码运行效率检查、组件性能的分析
    ? FailSafe    Visual Basic 自动错误处理和恢复系统
    ? Jcheck M$   Visual J++ 图形化的纯种和事件分析工具
    ? TrueCoverage  C++,Java,Visual Basic 函数调用次数、所占比率统计以及稳定性跟踪
    ? SmartCheck   Visual Basic 函数调用次数、所占比率统计以及稳定性跟踪
    ? CodeReview   Visual Basic 自动源代码分析工具

    Compuware DevPartner Studio
    ? 针对软件开发小组使用 Microsoft Visual C++,Microsoft Visual Basic,Java,ASP 或 HTML 设计的一套紧密配合的调试,测试和管理工具。该产品结合了强大的错误检测,性能分析,覆盖率分析,需求管理,测试和发布工具与全面的工程跟踪,错误管理,任务管理和自动的工作流程。DevPartner Studio Enterprise Edition 通过提高软件生产率,提高代码质量,支持工作流以及通讯标准让你对软件工程有更多的控制权。
    ? Win下最好的辅助调试工具。能够帮你检查内存泄漏,GDI泄漏,内存覆盖,数组越界,系统API调用参数是否合适。还能profile,对你的程序的运行时间进行分析,每个函数占用多少运行时间,每一行占用多少运行时间,帮你找出时间的瓶颈。
    Rational
    ? Rational Purify
    ? Rational Quantify
    ? Rational PureCoverage
    ? IBM Rational PurifyPlus
    Rational Purify
    ? 面向VC, VB或者Java开发的测试Visual C/C++ 和Java代码中与内存有关的错误,确保整个应用程序的质量和可靠性。在查找典型的Visual C/C++程序中的传统内存访问错误,以及Java中与垃圾内存收集相关的错误方面,Rational Purify可以大显身手。Rational Robot的回归测试与Rational Purify结合使用完成可靠性测试。
    ? 网址:http://www-306.ibm.com/software/rational/

    Rational Quantify
    ? 面向VC、VB 或者Java开发的测试性能瓶颈检测工具,它可以自动检测出影响程序段执行速度的程序性能瓶颈,提供参数分析表等等直观表格。帮助分析影响程序短执行速度的关键部分。
    ? 网址:http://www-306.ibm.com/software/rational

    Rational PureCoverage
    ? 面向VC、VB或者Java开发的测试覆盖程度检测工具,它可以自动检测你的测试完整性和那些无法达到的部分。作为一个质量控制工程,可以使用PureCoverage在每一个测试阶段生产详尽的测试覆盖程度报告。
    ? 网址:http://www-306.ibm.com/software/rational/

    IBM Rational PurifyPlus
    ? 一套完整的运行时分析工具,旨在提升应用的可靠性和性能。包括Purify、Quantify、PureCoverage。


    AutomatedQA AQTime
    ? AutomatedQA AQTime是软件项目的测试工具,能实时/静态地分析软件的执行效率和代码性能,发现软件项目客户端和服务器段的瓶颈所在、内存泄漏、消耗资源的代码及未经验证的算法。能够分析Delphi/BCB/VC/VB/GCC等工具开发的软件产品,此外,它有专门For VS.NET的版本。AQTime是专业Windows开发者在开发过程中消除臆测的完全方案,使开发者在完成项目时开发出坚如磐石的程序。通过AQTime无可匹敌的报告系统和测试分析架构,开发这不仅可以得知其项目中确实存在bug和瓶颈,而且会知道具体到哪个模块、类、线程、代码行出了问题,从而快速消除错误。
    ? 性能架构和内存分配调试器,适于Win32和.NET互联程序。该工具可以集成到Microsoft Visual Studio .NET中,也可单独使用。通过AQtime 4,您不仅可以发现程序瓶颈,还可以查找瓶颈来源。
    ? AQtime 4是AutomatedQA的获奖产品performance profiling和memory debugging工具集的下一代替换产品,支持Microsoft, Borland, Intel, Compaq 和 GNU编译器。新版本结合了旗舰产品Aqtime和AQtime for .NET的所有优势,前者主要面向Win32应用程序性能分析,而后者则是第一个Microsoft .NET平台的性能和内存分配架构工具。
    ? 如同其先前产品一样,AQtime 4可以为.NET和Win32程序生成全面细致的报告,从而帮助您轻松隔离并排除代码中含有的性能问题和内存/资源泄露问题。

    xUnit系列
    ? 目前的最流行的单元测试工具是xUnit系列框架,常用的根据语言不同分为JUnit(java),CppUnit(C++),DUnit (Delphi ),NUnit(.net),PhpUnit(Php )等等。该测试框架的第一个和最杰出的应用就是由Erich Gamma (《设计模式》的作者)和Kent Beck(XP(Extreme Programming)的创始人 )提供的开放源代码的JUnit。
    xUnit系列
    ? Aunit Ada http://www.libre.act-europe.fr
    ? CppUnit C++ http://cppunit.sourceforge.net
    ? ComUnit VB,COM http://comunit.sourceforge.net
    ? Dunit Delphi http://dunit.sourceforge.net
    ? DotUnit .Net http://dotunit.sourceforge.net
    ? HttpUnit Web http://c2.com/cgi/wiki?HttpUnit
    ? HtmlUnit Web http://htmlunit.sourceforge.net
    ? Jtest Java http://www.junit.org
    ? JsUnit(Hieatt) Javas cript 1.4以上 http://www.jsunit.net
    ? PhpUnit Php http://phpunit.sourceforge.net
    ? PerlUnit Perl http://perlunit.sourceforge.net
    ? XmlUnit Xml http://xmlunit.sourceforge.net
    CppUnit测试观念
    ? 测试的结果是程序直接监测的,而不是“通过人眼对屏幕上的输出结果的观测”。
      cppunit并不推荐屏幕输出,或者写可视化的测试单元
    ? 测试的过程是自动化的,不需要人工的干预
     cppunit推荐用大量典型测试数据进行回归的方式
    ? 测试用例是安全可控的。如果一个测试用例错误或者发生了异常,那么应该记录这个错误,并且去执行下一个用例,而不应该停下来。cppunit测试框架保证了这一点
    ? 单元测试是频繁发生的,每天都进行。
     由于测试案例的自动化,故此,在你的模块发生了重要改变时(特别是设计上的重大变化/重构时),你都应该马上运行一遍所有的测试程序,以确认你的代码没有引入预期(或曾经出现过)的bug。你可以在准备吃饭的时候,启动单元测试程序进行回归。
    ? 单元测试的目的是产生高质量的单元(模块)。从而减少系统集成(包括系统集成测试)的代价。

    Visual Studio 2005
    ? Team版的VS2005里面包含了完整的Test功能,具体有:Unit Test,WebTest和LoadTest.这一整套的测试基本涵盖了软件开发会使用到的测试功能.
    ? 我这里先从单元测试开始介绍(Unit Test).说起单元测试,很多使用.net进行开发的人员也许马上就想起了NUnit,实际上它是个很好的工具,在VS2005出来之前,我也一直使用.不过现在VS2005已经提供了与NUnit一样,甚至还要强大的功能,我们又有什么理由不使用呢?
    ? 微软因该说是很好的领会和贯彻了这个中国的经典儒家思想。Borland的Together好,.Net2005中就集成了了class designer,虽然说功能还不是很强大,同样,在单元测试成为软件开发中必不可少的环节而Nunit好评如潮的时,.Net2005中也加入了自己的单元测试组件。
    Visual Studio 2005
    ? 自动代码生成,是现代的开发环境追求的目标之一,而visual stutio无疑是走在了业界的最前列。在.net 2005中可以在右键菜单中选择unit test,而后针对该类的方法的单元测试的框架便自动生成,为开发者提供了很大的便利。
    Visual Studio 2005
    Visual Studio 2005
    Visual Unit
    ? 国产的单元测试工具,据说申请了多项专利,拥有一批创新的技术。
    ? VU目前版本适用于C++语言。
    ? 黑盒方面,可以轻松完成功能测试、边界测试、速度测试,
    ? 白盒方面,可以轻松完成语句覆盖、条件覆盖、分支覆盖、路径覆盖。这种空前的测试完整性,使代码中的缺陷无所循形。


    六、如何实施单元测试
    ? 学习基本理论
    ? 评估&选择单元测试软件
    ? 选择范围:静态分析、动态分析、测试程序框架
    ? 开发平台:
    ? VC6.0?VS2005
    ? QNX
    单元测试系列讲座
    ? 基本理论
    ? CppUnit

     

    七、讨论

     

    展开全文
  • 很像C++中的类,但是他的功能主要应用在生产过程中的多人协调生产,在化工生产过程中能够体现较大的效用。 每个软件单元中都包含有以下主要元素: 关系:通过关系表,可设置从当前软件单元对以下对象的访问方式: ...

    1.绪论

    TIA15.1中在1500系列的PLC中(固件版本在2.6或以上)引入“软件单元”的概念,通过软件单元,能够将用户程序细分为各个的程序部件,分别进行编辑和下载。很像C++中的类,但是他的功能主要应用在生产过程中的多人协调生产,在化工生产过程中能够体现较大的效用。

    在这里插入图片描述

    每个软件单元中都包含有以下主要元素:

    1. 关系:通过关系表,可设置从当前软件单元对以下对象的访问方式:
    • 其它软件单元中已发布的块和 PLC 数据类型
    • 软件单元之外的全局数据块
    • 工艺对象
    1. “程序块”(Program blocks) 文件夹:在该文件夹中,可创建各种程序块(组织块、函数块、函数、数据块)。
    2. “PLC 变量”(PLC tags) 文件夹:在该文件夹中,可创建 PLC 变量表、PLC 变量和常用常量。
    3. “PLC 数据类型”(PLC data types) 文件夹:在该文件夹中,可创建 PLC 数据类型。
    4. PLC 监控和报警:可打开报警和监控编辑器。
    5. PLC 报警文本列表:可打开文本列表编辑器。

    在软件单元内创建用户程序,是对现有编程方式的一种扩展。即,用户可灵活选择在软件单元之内或之外创建程序段。

    2.软件单元使用的基本注意事项

    使用软件单元时,需注意以下信息:

    1. 软件单元可与所有型号的 S7-1500 CPU(固件版本 V2.6 或更高版本)一同使用。
      每个 CPU 最多可使用 255 个软件单元。
    2. 由于每个软件单元程序都是单独独立的,所以该软件单元的所有程序块均选定 “优化块访问”(Optimized block access) 属性 ,且无法禁用。
    3. 如果支持软件单元的设备已创建有一个在线备份,则不支持软件单元的设备无法使用该备份。
    4. 程序消息中包含所有块的信息,而与这些块是否在软件单元中创建无关。
    5. 软件单元中的数据块和变量也将显示在设备代理中,因此可以导入和导出。数据的导入和导出与这些块是否已发布无关。
    6. OPC UA 客户端接口:系统在 OPC UA 客户端接口处生成的组态数据块(“<客户端接口名称_Configuration>”),通常在软件单元外生成。如需访问,则可创建一个与这些客户端接口的关系。为此,可使用“软件单元之外的数据块”(Data block outside of the software unit) 选项作为关系类型。

    3.软件单元编程的基本注意事项

    在软件单元内进行编程时,需注意以下事项:

    1. 该软件单元的所有程序块均选定“优化块访问”(Optimized block access) 属性,且无法禁用。即,将软件单元之外的块移动到软件单元中时,需启用该属性。因此,请勿执行带有需绝对寻址参数的指令,如“PUT”或“GET”。
    2. 在一个软件单元外创建的程序段,无法访问一个软件单元内创建的程序段。一个软件单元内编程的块无法访问软件单元之外的块。但用户可选择一个软件单元,允许访问软件单元之外的特定程序元素。例如,访问软件单元之外的全局数据块和工艺对象。
    3. 软件单元内的程序代码是整个用户程序的一部分。因此,块名称需在整个 CPU 内保持唯一。
    4. 在软件单元内,仅支持符号化编程方式。
    5. 在软件单元内,不支持故障安全块(F 块)。
    6. 除了组织块 (OB) 之外,其它所有块均为系统自动编号。自动分配的块编号在系统中不显示,但可在块属性中查看。
    7. 块接口中,不支持参数类型“TIMER”、“COUNTER”、“BLOCK_FB”和“BLOCK_FC”。
    8. PLC 变量表中,不支持位存储器、“Timer”函数和“Counter”函数。此时,可使用 IEC 定时器和计数器。
    9. 软件单元可单独编辑和加载。如果同一个软件单元中的块在多个编辑器进行了更改,则可在加载过程进行数据同步。
    10. 系统常量在相关对象所在的软件单元中创建,不能被发布。即,无法从该软件单元之外进行对它访问。
    11. 当使用系统中用作函数或函数块的各指令时,这些系统函数或系统函数块将在该软件单元外的“系统块”(System blocks) 文件夹中进行创建。而系统函数块中该数据块的单实例则与之不同,在相应软件单元的“系统块”(System blocks) 文件夹中创建且状态为“未发布”。如果需要移动该数据块并进行访问,则需将访问方式更改为“已发布”(Published) 并创建一个与该数据块关系。
    12. 使用软件单元不会更改变量通过 HMI 或 OPC UA 的访问方式。这些选项仍在本地变量的块接口中或全局变量的 PLC 变量中定义。

    3.软件单元支持编程语言

    编程语言
    在软件单元中,可使用以下编程语言:

    • LAD
    • FBD
    • SCL
    • GRAPH
    • ProDiag

    在软件单元中,编程语言 LAD、FBD、SCL 和 GRAPH 的应用与其它环境中并无任何差别。在软件单元中进行编程时,请注意以下 ProDiag 特别事项:

    1. 特定监控文本中引用的用户自定义文本列表可存储在任何软件单元中,但不能存储在软件单元之外。
    2. 每个软件单元都带有一个自己的 ProDiag OB,并对其指定一个 >=250 的编号,而 ProdDiag FB 的全局变量监控只能监控同一个软件单元中的操作数。
    3. ProDiag FB 仅包含引用同一个软件单元中参数的块监控。ProDiag FB 无法发布。因此,无法从其它软件单元中进行访问。
    4. 仅当在软件单元中执行写入操作且 ProDiag FB 位于全局监控和调用中时,才能对该 ProDiag FB 进行初始值采集。
    展开全文
  • Flink 基本原理与生产实践分享【入门必读,概念清晰】 https://zh.wikipedia.org/zh-hans/Apache_Flink Apache Flink是由Apache软件基金会开发的开源流处理框架,其核心是用Java和Scala编写的分布式流数据流引擎。...

    Flink 基本原理与生产实践分享【入门必读,概念清晰】

    https://zh.wikipedia.org/zh-hans/Apache_Flink

    Apache Flink是由Apache软件基金会开发的开源流处理框架,其核心是用JavaScala编写的分布式流数据流引擎。Flink以数据并行流水线方式执行任意流数据程序,Flink的流水线运行时系统可以执行批处理和流处理程序。此外,Flink的运行时本身也支持迭代算法的执行。

    Flink提供高吞吐量、低延迟的流数据引擎以及对事件-时间处理和状态管理的支持。Flink应用程序在发生机器故障时具有容错能力,并且支持exactly-once语义。程序可以用Java、Scala、PythonSQL等语言编写,并自动编译和优化到在集群或云环境中运行的数据流程序。

    Flink并不提供自己的数据存储系统,但为Amazon Kinesis、Apache KafkaHDFSApache Cassandra和ElasticSearch等系统提供了数据源和接收器。

     

    概述

    Apache Flink的数据流编程模型在有限和无限数据集上提供单次事件(event-at-a-time)处理。在基础层面,Flink程序由流和转换组成。 “从概念上讲,流是一种(可能永无止境的)数据流记录,转换是一种将一个或多个流作为输入并因此产生一个或多个输出流的操作”。

    Apache Flink包括两个核心API:用于有界或无界数据流的数据流API和用于有界数据集的数据集API。Flink还提供了一个表API,它是一种类似SQL的表达式语言,用于关系流和批处理,可以很容易地嵌入到Flink的数据流和数据集API中。Flink支持的最高级语言是SQL,它在语义上类似于表API,并将程序表示为SQL查询表达式。

    编程模型和分布式运行时

    Flink程序在执行后被映射到流数据流,每个Flink数据流以一个或多个源(数据输入,例如消息队列或文件系统)开始,并以一个或多个接收器(数据输出,如消息队列、文件系统或数据库等)结束。Flink可以对流执行任意数量的变换,这些流可以被编排为有向无环数据流图,允许应用程序分支和合并数据流。

    Flink提供现成的源和接收连接器,包括Apache Kafka、Amazon Kinesis、HDFSApache Cassandra等。

    Flink程序可以作为集群内的分布式系统运行,也可以以独立模式或在YARN、Mesos、基于Docker的环境和其他资源管理框架下进行部署。

    状态:检查点、保存点和容错

    Apache Flink具有一种基于分布式检查点的轻量级容错机制。检查点是应用程序状态和源流中位置的自动异步快照。在发生故障的情况下,启用了检查点的Flink程序将在恢复时从上一个完成的检查点恢复处理,确保Flink在应用程序中保持一次性(exactly-once)状态语义。检查点机制暴露应用程序代码的接口,以便将外部系统包括在检查点机制中(如打开和提交数据库系统的事务)。

    Flink还包括一种名为保存点的机制,它是一种手动触发的检查点。用户可以生成保存点,停止正在运行的Flink程序,然后从流中的相同应用程序状态和位置恢复程序。 保存点可以在不丢失应用程序状态的情况下对Flink程序或Flink群集进行更新。从Flink 1.2开始,保存点还允许以不同的并行性重新启动应用程序,这使得用户可以适应不断变化的工作负载。

    -------------------------------------------

    下面是小象学院的公开课,原始地址在:http://www.chinahadoop.cn/course/1102

    下面是我以前的听课笔记,花了很多时间自己一个字一个字敲出来的,想想还是分享给大家看看,这样其他人就不用按暂停来写听课笔记了。

    原讲座时间:2018.1.29    作者:罗江宇

    实时计算的一些基本概念

    有界数据:在离线层面很常见,读文件最终会结束就是有界。

    实时计算用有界数据计算无界数据,比如几分钟的。实时计算就是处理无界数据的。

    事件时间:事件产生的时间,一条日志产生的时间

    处理时间:实时计算处理时候的时间。

    窗口:最近一分钟或者几分钟的数据进行切割聚合,窗口就是切分有界数据。

    水位线:水位线以下的事件已经到齐就是一个标准。

    触发器:很多情况就是和窗口结合,触发窗口里的数据计算

    转换:也称算子。

    at-most-once:数据计算至多一次,会丢数据,很少用。

    at-lease-once:最少处理一次,数据传输计算肯能会重复计算,有数据重复的情况

    at-exactly-once:整一次,会有性能损失。

    blink:SQL 方面做了很多改进,还有就是onyarn做了很多改进。

    自己公司是Flink千万级每秒

    其他引擎是用微批 ,10秒或者1秒一批,就会影响延迟。

    用系统时间计算窗口会丢失一些时间,用eventtime就不会丢。

    状态:机器宕机,可以恢复。一个有状态的算。

    storm:因为进程挂掉,导致状态丢失。storm已经没人用了,jstorm只是在其上做一些优化。

    支持者at-least-once.

    从kafka消费一个数据,再写到kafka。管理应用有很多为问题,稳定性也有问题,比如进程挂了。

    一进来数据就是微批做了切割。低延迟很难达到。ss2.2做了一个融合离线和实时写法一样。也会支持全流式。

    部署:local IDE底下做一些测试;

    cluster:standalone:利用率比较低。

    onyarn:提高机器利用率。

    datastreamAPI:流式处理的API

    datasetAPI:批量处理,是通过流式处理做批处理。

    用flink还是流失的多。

    CEP:复杂事件处理。有做用户行为分析,实时分控,提高分控吞吐量,业界有些吞吐量不行。

    SQL+CEP和动态CEP,因为用户写代码很复杂。

    要先有数据构建一个数据流,一开始上面代码还少了一块要构建流失环境变量。选择是dataset还是datastream.

    source:数据源,从kafka读。读完后做一些转化。这里Map这个算子就是1对1的概念。

    10秒聚合统计这个id的次数。

    整体是来一条数据就流下去,象工厂的流水线一样。

    并行度:多少个线程去跑。

    数据切割,一个算子

    timewindow:按时间切割,等时间的。这个实际用的最多。

    Count :按事件的个数。

    滚动window:时间是对齐的。适合做BI类似的东西。

    固定长度:两个窗口之间无交集数据。一个数据不会同时属于2个window..可以有时间的也可可以有count的。

     

     

    移动窗口,适合求比如最近5分钟的。也可以做一些监控这些事情。

    不支持countWindow,只支持timewindow。

    <sesion gap的就可以聚合在一起,认为是一个seeeion,适合线上行为分析。在这个session时间内做了哪些事情。

    sesion gap设置太大就不合理,因为都聚合在一起了。

     

    3种时间,

    eventtime:事件产生的时间,这个一般用的比较多。

    ingestion:进入flink的时间(进入souce的时间),

    processingtime:某个算子开始处理的时间(window)

    window和eventtime结合起来做事情。

    水印:数据处理到那个位置了。水印到了说明之前的数据已经到齐了。

    数据没有到齐,都存起来先。一些中间状态。

    不要做持久化,只要做配置就会被Flink托管。机器挂了,进程结束都可以根据这些状态恢复。

    operatorstate:算子的状态

    keyedstate:存hash的key

    checkpoint:把状态做一些容错。以前的流式计算为了计算一个state,所有的算子都要停止,获取一个快照,记录下状态。相当于全局同步。Flink是全局异步,只有某个标志到了,会把这个状态做一个快照。

    exavtly-once:假如需要依赖外部的东西需要三方都保证。不光是flink保证,还要souce好sink都要保证。

    原理是数据源加一个标志barriers,以这个算子为例所有的barriers都到齐了就会做一个快照。数据源会定时发送barriers进来,就是一个要做快照的标志。

    checkpoint主要做内部失败,从最近的一个成功的checkpoint恢复。

    生成t1就会删除t0,会fork一个版本出来。从t3时刻做了一次恢复从这个点进行一次回溯的计算。

    主要是作为外部恢复,原来需要的资源不够,需要把资源改大一点,需要重启。

    目前官方的需要通过命令去做还没有一套好的API让用户直接调用java代码或者scala代码,目前的savepoint还不是很好用。

    运行时架构分为三个角色:client,jobmanager,taskmanager.

    先生成一个图,通过AKKA把“”图“”发给jobmanager(看成一个master,做协调和分发的概念)

    jobmanager两个比较重要的功能:一个是调度,这个节点分配到那个taskmanager.

    二是checkpoint的协调器,checkpoint官方也说了是定时注入到source数据源。

    taskmanager:真正干事情的,它有task槽的概念。

    task槽实际上就是对taskmanager资源的分割。task是跑在task槽上真正在执行任务。

    taskmanager也会汇报心跳做一些统计。

    taskmanager可以看做一个进程。把内存和CPU分割为3部分。虚线表示一个task,可以看成一个线程。

    做一个chain:source和map 这2个算子泡在一个subtask上,这2个是可以串一起。这种是可以做一些优化。

    具体组成operatorChain有7个条件。

    operator:一些算子

    task:真正运行的,就是几个operator组成一个chain运行在一个task上。

    ETL:数据清洗。

    数据埋点agent。怎么清洗任务下发给flinkETL。

    大应用好管理,也有风险大的topic,某一台机器一挂影响所有ETL。

    小应用每个ETL是隔离不影响,管理成本又增大了,要做监控,只会影响某一个ETL。

    实际经验还是用小应用。

    计算规则中心下发给Flink,Flink做一个聚合到es或者druid。druid做一个OLAP引擎,做一些预聚合。再落到dashboard做一个实时的BI和告警。ES:日志检索的。

    这里有个问题就是数据是先在flink聚合再到druid还是只是flink做个ETL,聚合在druid里做,因为他有预聚合。

    实际生产下要做个权衡,如果flink不够强大的话,那么只做个ETL。因为window聚合有些状态管理比较消耗资源。

    或者可以在flink做1分钟的基本单元的聚合然后再到druid做10分钟的很大的聚合进行累加也是比较常见的,相当于只做一个基本单元的聚合。因为流式处理window比较大是不可以的,会有内存过大导致各自问题。

    CEP只能静态不能动态加载CEP实时生效。可以做一些匹配告警这种。

    实时机器学习做一些推荐,相对CEP还不是很成熟。

    source扩大并行度能不能起到作用,有些扩大了没用。

    遇到很多自己写一些状态,不符合flink托管的状态,实际开发中要考虑状态问题。

    异常一捕获就会丢失数据。不捕获又不好。需要权衡。

    在一定延迟范围业务方可以接受多少延迟,用多少并行度去处理。

    追数据能力:机器宕机,从上一个checkpoint去恢复数据。官方说追数据能力3-5倍(正常数据量的3-5倍)以上。数据完整性和数据延迟。否则如果数据很大需要去掉checkpoint,直接从kafka消费数据开始计算。所以追数据能力不行要做一个权衡。

    从运维角度。

    如果用户说丢数据,需要有可以反驳用户。也可能是发送方延迟,构筑一个简单的数据质量体系告诉用户。

    flinkUI上的度量比较简单,需要自己构建收集flink的度量。

    flink的日志在大规模生产有问题,日志比较多会把flinkUI 搞挂,需要构建flink日志的滚动。还有用户会去看。

    要做一些flink平台服务化,应用监控的质量体系。

    稳定性保证:纯流式的,还有很多问题,很多都是某一个组件抖动,为了保证一致性会有一些问题。

    构建SQL平台:SQL给用户直接写SQL。

    学习流式计算作为一个函数式编程语言需要scala,面试必须。

    Flink核心的通讯是AKKA也就是scala写的。

    paper:论文。

    源码上的接口上有注释,官方文档毕竟不完善。

    展开全文
  • python单元测试unittest

    万次阅读 2011-12-26 23:41:50
    无意中发现了一个巨牛的人工智能教程,忍不住分享一下给大家。...虽然会很快熟悉内容,但是修改和调试将是一件痛苦的事情,如果你在修改了代码后出现问题的话,而单元测试可以帮助我们很快准确的...
  • 控制单元

    千次阅读 2019-01-13 00:52:10
    控制单元的功能 发出各种控制命令或者是微指令,控制整个计算机系统,包括CPU内部的各个部件能够协调,稳定,正确,连续的运行。 1、控制单元的外特性 输入信号: (1)指令寄存器。 来自于指令寄存器的指令的操作...
  • 在正式开始今天的话题之前,我先给你分享一个工厂生产电视机的例子。 工厂首先会将各种电子元器件按照图纸组装在一起构成各个功能电路板,比如供电板、音视频解码板、射频接收板等,然后再将这些电路板组装起来构成...
  • Java的单元测试和集成spring单元测试

    千次阅读 2016-08-30 21:04:26
    今天我们来聊下junit(单元测试)。 为了后期测试基于spring的单元测试,我们直接新建spring工程。 新建之后,我们先讲一般在java项目中怎么去做单元测试。 我们先定义一个实体User 在service
  • Go的单元测试技巧

    千次阅读 2018-09-17 01:10:24
    遂花时间学习整理了一下单元测试的基本方法,以及在Go中的实践技巧。 单元测试的难点 以下是我在尝试进行单元测试的过程中遇到的一些难点,在下文中会介绍相应的一些应对方案。 1.掌握单元测试粒度 ...
  • NAND Flash SSD 是如何生产出来的?

    千次阅读 2017-12-24 09:56:37
    关于NAND Flash技术基本原理之前有过讲解,大家可以参考文章闪存技术最全面解析。今天主要讨论下NAND Flash生产过程、架构和关键指标。NAND Flash是从原始的硅材料加工出来的,硅材料被加工成晶圆(Waf
  • php单元测试入门教程phpunit详解

    万次阅读 2017-02-14 16:29:24
    指对软件中的基本单元进行测试,如函数、方法等,以检查其返回值或行为是否符合预期;实际中软件是很复杂的,由许多组件构成,执行流程连贯在一起,要进行单元片段的测试,就需要为其提供执行上下文(或者说参数)和...
  • 前端单元测试工具

    万次阅读 2016-06-12 10:33:06
    单元测试Unit Test 很早就知道单元测试这样一个概念,但直到几个月前,我真正开始接触和使用它。究竟什么是单元测试?我想也许很多使用了很久的人也不一定能描述的十分清楚,所以写了这篇文章来尝试描述它的特征和...
  • 关于单元测试的总结

    千次阅读 2018-08-21 14:40:49
    开发人员必备的技能——单元测试 说起软件测试四个字,想必大家脑海中浮现的有集成测试、系统测试、黑盒测试、白盒测试等,可能就是没想到会有单元测试。 对于大学是学习软件工程专业出身的同学来说可能会听过这四...
  • 深入理解单元测试

    千次阅读 2020-08-30 20:16:46
    作为一个程序员,或多或少听说过单元测试,但很多小伙伴还没有在实际项目中用到。究其原因,可能是对单元测试有一些误解,比如: 写单元测试需要花费更多的时间,我每天写产品代码都要加班,哪来时间写测试; 写...
  • 单元测试—Moq框架

    千次阅读 2015-03-15 14:55:54
    【概念】    Moq(英语发音是Mock-...它的目标是让模拟以一种自然的方式与现有单元测试进行集成,使它更加简单、直观,以避免开发人员被迫重写测试或高成本的学习测试框架。这使它成为了一个高生产力、类型安全
  • 单元测试和sit测试和uat测试

    千次阅读 2018-11-16 11:02:38
    在软件开发工程中,一般是在本地开发,开发完成自己本地通过单元测试,判断自己的代码...第三个阶段:就是把需要上生产的代码在生产环境进行最后的演练,让用户验收,这个阶段叫uat测试阶段; 第一个阶段(单元测...
  • 单元测试和功能测试

    千次阅读 2018-01-06 11:33:47
    单元测试和功能测试区别 很多时候,系统开发好比建筑房屋。尽管这种类比不很恰当,但为了理解单元测试与功能测试的区别,我们可以扩充这种类比。单元测试好比房屋建筑现场的建筑监理员。他关心房屋的各个内部系统...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 99,639
精华内容 39,855
关键字:

属于生产基本单元的是