首页 > 其他分享 >圈复杂度和可测试性

圈复杂度和可测试性

时间:2024-03-30 15:55:51浏览次数:18  
标签:do run 函数 复杂度 ret 测试 config

  1. 最好用的C++圈复杂度分析工具:pip install lizard,没想到它解析C++的函数块超级快,可以用来作为建立进一步的代码片分析的基础,完胜其他所有工具。
  2. 我花了1天多将一个C++模块测试覆盖率做到100%,对于代码如何才具有良好可测试性有了直观的经验,从测试的角度看代码的设计是否简洁是一个非常合理的角度。
  3. 如果代码的可测试性很好,那么AI也能非常容易的处理它,可见未来的代码,不是要写的复杂,就是写的直接简洁,实际上就是要保持线性。

如何将一个难以测试的类改进为易于测试的类?

例子1,切分辅助的纯函数

让这个类的构造依赖的参数简单,简单不一定是参数个数少,而是这些参数的构造本身的依赖不要有太多深度。

以前有一个痛点问题是,一个类的内部有一些成员变量不好修改,于是不好再测试的时候控制函数内部的分支行为。解决方式是:将控制复杂行为的函数实现拆分,拆分为调用几个辅助函数,这几个辅助函数是纯函数,依赖的参数都通过函数参数传递(即使这个参数是类成员变量就有的),这样这个辅助函数就容易被测试,因为是一个纯函数,因为都通过函数参数传递状态。
例子:

class A{
public:
  void run(){
      if(config.enable_xxx){
         do_something();
      }
  }
  void dosomthing(){
    status.value = ...
  }
private:
  Config config;
  Status status;
}

这个run就不好测试,因为测试方不好控制Config的状态。修改如下:

class A{
public:
  void run(){
    do_something(config, status);
  }

  bool do_somthting(const Config& config, const Status& status){
    if(!config.enable_xxx){
       return false;
    } 
    status.value = ...
  }
private:
  Config config;
  Status status;
}

这个时候就可以对 do_something 做测试了,因为do_somthting依赖的对象,和修改的对象,都是通过函数参数传递的,是一个纯函数。那么测试函数和A::run 对于do_somthting来说都是同等的访问能力。

例子2: 处理内部的返回值问题

下面的类,内部对于某个API请求对结果做处理,但是测试方不易于控制API请求的结果,不好测试到对应分支。

class A{
public:
   void run(){
       xxx v;
       bool ret = receiver.pop(v);
       if(ret){
         ....
       }
   }
}

解决方式是把获取数据和处理数据完全的分开成两个部分:

class A{
public:
   void run(){
     xxx v;
     bool ret = receiver.pop(v);
     on_receive_v(ret, v);
   }
   bool on_receive_v(bool ret, const xxx& v){
       if(!ret){
         return false;
       }
       ...
   } 
}

这样分支跑到 on_receive_v 里面去,而 on_receive_v 是一个易于通过参数控制分支测试的函数。

标签:do,run,函数,复杂度,ret,测试,config
From: https://www.cnblogs.com/math/p/18105611/testable-code

相关文章

  • 经典Prompt欣赏 - 给代码生成单元测试
    在Twitter上看到一段给代码生成单元测试的Prompt:https://twitter.com/mattshumer_/status/1773385952699789808虽然它是针对Claude3的,但理论上来说可以适用于绝大部分模型。Prompt如下:<prompt_explanation>Youareanexpertsoftwaretestertaskedwiththoroughlytest......
  • 经典Prompt欣赏 - 给代码生成单元测试
    在Twitter上看到一段给代码生成单元测试的Prompt:https://twitter.com/mattshumer_/status/1773385952699789808虽然它是针对Claude3的,但理论上来说可以适用于绝大部分模型。Prompt如下:<prompt_explanation>Youareanexpertsoftwaretestertaskedwiththoroughlytest......
  • 一站式自动化测试工具——AI-TestOps
    一站式自动化测试工具——AI-TestOps1.背景介绍随着软件开发周期的不断缩短,软件质量保证变得越来越重要。自动化测试是提高软件质量的关键手段之一。然而,传统的自动化测试工具往往存在一些问题,如测试用例编写复杂、测试覆盖率低、测试结果分析困难等。为了解决这些问题,AI......
  • MogDB/openGauss 坏块测试-对启动的影响-测试笔记1
    MogDB/openGauss坏块测试-对启动的影响-测试笔记1在UPDATE操作提交后,脏块落盘前kill掉mogdb数据库,然后对UPDATE修改的坏进行以下破坏操作,仍然能够启动数据库,数据未丢失。1、用旧数据文件替换,可以启动2、修改成错误的checksum,可以启动3、数据块修改成错误的lsn,可......
  • Junit深入讲解(JAVA单元测试框架)
    1、此处用的是Junit5,此处pom文件需要引的依赖是<dependency><groupId>org.junit.jupiter</groupId><artifactId>junit-jupiter-api</artifactId><version>5.9.1</version><scope&......
  • 记一次对我的学校的微信小程序的渗透测试(短信轰炸+教师手机号泄露)
    0x01教师手机号泄露打开智慧校园小程序点进教师登录后发现,输入我老师名字后会显示尾号抓包,在response中得到完整的手机号手机注册那里填入抓到的手机号,便可以发短信验证码(填别的手机号会被前端的验证拦截并显示'该手机号不对,清核对信息',但验证是前端的[前端就是通......
  • 时间复杂度
    intcount=0;for(intk=0;k<100;k++){count++;}cout<<cunt;//程序执行次数:100//时间复杂度:O(1)intcount=0;for(intk=0;k<2*N;k++){count++;}intM=10;while(m--){count++;}cout<<count;//程序执行次数:2*n+m2*n+10//时间复杂度:O(n)intcount=0;for(int......
  • 在使用PageHelper插件进行分页查询时,为什么在Postman进行后端测试时返回的data中对应
    注意:在使用PageHelper插件进行分页查询,由Postman进行后端测试时,需要根据返回的total(查询的总记录数)和测试设置的pageSize(每页记录条数)来设置page(查询页码)的值,否则后端测试返回的data中对应的rows可能为空。理由如下:假设此时是这样一个查询情景:通过动态SQL进行条件查询,......
  • MySQL - [06] 海贼王测试数据
     一、建表语句createtablerole(roleIdintnullcomment'角色id',namevarchar(32)nullcomment'姓名',apearNumvarchar(50)nullcomment'登场集数',addressvarchar(50)nullcomment'上传地点',......
  • 如何高效的开展app的性能测试?
    APP性能测试是什么从网上查了一下,貌似也没什么特别的定义,我这边根据自己的经验给出一个自己的定义,如有巧合纯属雷同。客户端性能测试就是,从业务和用户的角度出发,设计合理且有效的性能测试场景,制定各性能场景下的客户端性能指标(内存、CPU、卡顿数、帧率、电量、加载时长等),并制......