gTest 学习

2023-11-08

gTest 

目录

在Clion上安装

断言

判断bool

数值判断

字符串判断

显示返回成功或失败

异常检查

输出更详细信息

自定义输出

浮点数相等

相近判断

事件

全局事件

TestSuite事件

TestCase事件

参数化


在Clion上安装

下载后解压到项目

配置cmake 

cmake_minimum_required(VERSION 3.16)
project(myTest)

message("------------ Options -------------")
message("  CMAKE_BUILD_TYPE: ${CMAKE_BUILD_TYPE}")
message("  CMAKE_BUILD_TYPE: Hello World!")

# 编译google test,会在当前目录生成libtest.a静态库
add_subdirectory(./googletest)
#头文件
include_directories(${PROJECT_SOURCE_DIR}/src/include ./googletest/include)

#源文件
aux_source_directory(${PROJECT_SOURCE_DIR}/src/main dir_srcs)
#库文件 : libtest.a 添加到链接路径中
link_directories(${PROJECT_SOURCE_DIR}/lib ${PROJECT_SOURCE_DIR}/googletest)

#需要添加googletest运行需要的pthread
set(LIBRARIES pthread)

set(CMAKE_CXX_STANDARD 11)

add_executable(myTest main.cpp)
target_link_libraries(${PROJECT_NAME} gtest)

测试点

TEST(TestSuiteName,TestCaseName)

最简单的

#include <iostream>
#include <gtest/gtest.h>


int main(int argc, char **argv)
{
    testing::InitGoogleTest(&argc, argv);
    return RUN_ALL_TESTS();
}

在main的上面空行(不一定空行,其实只要不在方法里都行),点Run all运行全部

 

就会产生底下这个 

 

如果运行main的话

 

断言

ASSERT_* 系列的断言,当检查点失败时,退出当前函数(注意:并非退出当前案例)。

EXPECT_* 系列的断言,当检查点失败时,继续往下执行。

可以通过ASSERT_*<<"msg"; 输出msg

判断bool

ASSERT_* EXPECT_* 功能
ASSERT_TRUE(condition) EXPECT_TRUE(condition) condition是否为true
ASSERT_FALSE(condition) EXPECT_FALSE(condition) condition是否为false

数值判断

ASSERT_* EXPECT_* 功能
ASSERT_EQ(expect,actual) EXPECT_EQ(expect,actual) expect==actual
ASSERT_NE(expect,actual) EXPECT_NE(expect,actual) expect!=actual
ASSERT_LT(expect,actual) EXPECT_LT(expect,actual) expect<actual
ASSERT_LE(expect,actual) EXPECT_LE(expect,actual) expect<=actual
ASSERT_GT(expect,actual) EXPECT_GT(expect,actual) expect>actual
ASSERT_GE(expect,actual) EXPECT_GE(expect,actual) expect>=actual

字符串判断

ASSERT_* EXPECT_* 功能
ASSERT_STREQ(expect,actual) EXPECT_STREQ(expect,actual) 字符级别相等
ASSERT_STRNE(expect,actual) EXPECT_STRNE(expect,actual) 字符级别不等
ASSERT_STRCASEEQ(expect,actual) EXPECT_STRCASEEQ(expect,actual) 忽略大小写后,字符级别相等
ASSERT_STRCASENE(expect,actual) EXPECT_STRCASENE(expect,actual) 忽略大小写后,字符级别不等

显示返回成功或失败

显示返回成功SUCCEED()

ASSERT版本:  FAIL()

EXPECT版本:  ADD_FAILURE()

异常检查

ASSERT_* EXPECT_* 功能
ASSERT_THROW(statement,expection_type) EXPECT_THROW(statement,expection_type) statement抛出的异常类型为expection_type
ASSERT_ANY_THROW(statement) EXPECT_ANY_THROW(statement) statement抛出的任意类型异常
ASSERT_NO_THROW(statement) EXPECT_NO_THROW(statement) statement不抛异常

输出更详细信息

ASSERT_* EXPECT_* 功能
ASSERT_PRED1(pred,val1) EXPECT_PRED1(pred,val1) pred(val1)是否输出true
ASSERT_PRED2(pred,val1,val2) EXPECT_PRED2(pred,val1,val2) pred(val1,val2)是否输出true

以此类推,到ASSERT_PRED5

自定义输出

ASSERT_* EXPECT_* 功能
ASSERT_PRED_FORMAT1(pred,val1) EXPECT_PRED_FORMAT1(pred,val1) pred(val1)是否输出true
ASSERT_PRED_FORMAT2(pred,val1,val2) EXPECT_PRED_FORMAT2(pred,val1,val2) pred(val1,val2)是否输出true

以此类推,到ASSERT_PRED_FORMAT5

浮点数相等

ASSERT_* EXPECT_* 功能
ASSERT_FLOAT_EQ(expect,actual) EXPECT_FLOAT_EQ(expect,actual) expect==actual
ASSERT_DOUBLE_EQ(expect,actual) EXPECT_NE(expect,actual) expect!=actual

相近判断

ASSERT_NEAR(val1, val2, abs_error) :|val1-val2|<=abs_error

#include <iostream>
#include <gtest/gtest.h>
#include <string>

int add(const int& a,const int& b){return a+b;}

TEST(TEST_SUCCESS,TEST1){
    EXPECT_EQ(3,add(1,2)); //判断相等
}

TEST(TEST_FAILED,TEST1){
    EXPECT_EQ(4,add(1,2));
}

int x[]={1,2,3,4};
int y[]={1,3,2,4};

TEST(TEST_ARRAY,TEST1){
    for(int i=0;i<4;++i){
        EXPECT_EQ(x[i],y[i]);
    }
}

TEST(TEST_ARRAY,TEST2){
    for(int i=0;i<4;++i){
        EXPECT_EQ(x[i],y[i])<< "Vectors x and y differ at index " << i;
    }
}

TEST(string_cmp_test,test1){
    const char* pszCoderZh="CoderZh";

    const wchar_t* wszCoderZh=L"CoderZh";

    std::string strCoderZh="CoderZh";
    std::wstring wstrCoderZh=L"CoderZh";

    EXPECT_STREQ("CoderZh",pszCoderZh);//判断字符串相等
    EXPECT_STREQ(L"CoderZh",wszCoderZh);

    EXPECT_STRNE("CnBlogs",pszCoderZh);//判断字符串不等
    EXPECT_STRNE(L"CnBlogs",wszCoderZh);

    EXPECT_STRCASEEQ("coderzh",pszCoderZh);//判断字符串忽略大小写后相等
    //EXPECT_STRCASEEQ(L"coderzh",?wszCoderZh);????不支持

    EXPECT_STREQ("CoderZh",strCoderZh.c_str());
    EXPECT_STREQ(L"CoderZh",wstrCoderZh.c_str());
}

TEST(string_cmp_test,test2){
    std::string str="敲你马";
//    std::wstring wstr=L"敲你马";  //不知道为什么崩了

    EXPECT_STREQ("敲你马",str.c_str());
//    EXPECT_STREQ(L"敲你马",wstr.c_str());
}

TEST(explicit_test,test1){
    ADD_FAILURE()<<"failed";//返回失败

//    FAIL();

    SUCCEED();//直接返回成功
}

int gcd(int a,int b){
    if(a==0||b==0)throw "don't do that";
    int c=a%b;
    while(c){
        a=b;
        b=c;
        c=a%b;
    }
    return b;
}

TEST(foo_test,handle_zero_input){
    EXPECT_ANY_THROW(gcd(0,5)); //期待抛出任何异常
    EXPECT_THROW(gcd(5,0),const char*); //抛出指定类型异常
}

bool mutuallyPrime(const int& a,const int& b){
    return gcd(a,b)==1;
}

TEST(predicate_assert_test,test1){
    EXPECT_PRED2(mutuallyPrime,5,10); //期待mutuallyPrime(5,4)返回true

}

testing::AssertionResult AssertFoo(const char* m_expr, const char* n_expr, const char* k_expr, int m, int n, int k) {
    const int result=gcd(m,n);
    if (result == k)
        return testing::AssertionSuccess();
    testing::Message msg;
    msg << m_expr << "?和?" << n_expr << "?的最大公约数应该是:" << result << "?而不是:" << k_expr;
    return testing::AssertionFailure(msg);
}

TEST(AssertFooTest, HandleFail){
    EXPECT_PRED_FORMAT3(AssertFoo, 3, 6, 2); //自定义错误输出
}

TEST(FloatTest,Test1){
    EXPECT_FLOAT_EQ(1.6f,5.0f/2);
}
TEST(FloatTest,Test2){
    EXPECT_DOUBLE_EQ(1.6,5.0/2);
}
TEST(FloatTest,Test3){
    EXPECT_PRED_FORMAT2(testing::FloatLE, 1.6f,5.0f/2);
    EXPECT_PRED_FORMAT2(testing::DoubleLE, 1.6,5.0/2);
}

TEST(NearTest,Test1){
    EXPECT_NEAR(1,2,1);
}

//template <typename T>
//class FooType {
//public:
//    void Bar() {
//        testing::StaticAssertTypeEq<int, T>();
//    }
//};
//
//TEST(TypeAssertionTest,Demo)
//{
//    FooType<bool>fooType;
//    fooType.Bar();
//}

int main(int argc, char **argv)
{
    testing::InitGoogleTest(&argc, argv);
    return RUN_ALL_TESTS();
}

 

事件

全局事件

SetUp()方法在所有案例执行前执行

TearDown()方法在所有案例执行后执行

需要继承testing::Environment,并在main中使用testing::AddGlobalTestEnvironment(你的类);

进行注册

 

如果有多个,你可以注册多个

 

TestSuite事件

我们需要写一个类,继承testing::Test,然后实现两个静态方法

SetUpTestCase:每个TestSuite执行前执行

TearDownTestCase:每个TestSuite执行后执行

测试点不再使用TEST,而是TEST_F,第一个参数传你的类,第二个传test case名字

 

TestCase事件

我们需要写一个类,继承testing::Test,然后实现两个静态方法

SetUp:每个TestCase执行前执行

TearDown:每个TestCase执行后执行

测试点不再使用TEST,而是TEST_F,第一个参数传你的类,第二个传test case名字

#include <iostream>
#include <gtest/gtest.h>
#include <string>

//要有test case才会执行setup和tear down
class FooEnvironment:public testing::Environment{
public:
    void SetUp() override{  //在所有案例执行前执行
        std::cout<<"Foo FooEnvironment setUp"<<std::endl;
    }
    void TearDown() override{  //方法在所有案例执行后执行
        std::cout<<"Foo FooEnvironment tearDown"<<std::endl;
    }
};

class FooTest:public testing::Test{
protected:
    static void SetUpTestCase(){  //第一个TestCase之前执行
        a=new int[10];
        for(int i=0;i<10;++i)a[i]=i;
        std::cout<<"init"<<std::endl;
    }
    static void TearDownTestCase(){  //在最后一个TestCase之后执行
        delete[] a;
        a= nullptr;
        std::cout<<"destroy"<<std::endl;
    }

    static int* a;
};

int* FooTest::a= nullptr;

//使用TEST_F这个宏,第一个参数必须是我们上面类的名字
TEST_F(FooTest,test1){
    for(int i=0;i<10;++i){
        EXPECT_EQ(i,a[i]);
    }
}

TEST_F(FooTest,test2){
    for(int i=0;i<10;++i){
        EXPECT_EQ(i-1,a[i]);
    }
}

class FooTest2:public testing::Test{
public:
    void SetUp() override {  //在每个TestCase之前执行
        std::cout<<"start case"<<std::endl;
    }
    void TearDown() override {  //在每个TestCase之后执行
        std::cout<<"end case"<<std::endl;
    }
};

//使用TEST_F这个宏,第一个参数必须是我们上面类的名字
TEST_F(FooTest2,test1){
    SUCCEED();
}

int main(int argc, char **argv)
{
    testing::AddGlobalTestEnvironment(new FooEnvironment);
    testing::InitGoogleTest(&argc, argv);
    return RUN_ALL_TESTS();
}

参数化

写一个类,继承testing::TestWithParam<T>,这个T就是测试的类型

有个类型参数化没怎么看懂,以后再说

INSTANTIATE_TEST_SUITE_P(prefix,test_suite_name,...)

第一个参数是前缀,

第二个参数是名称,就是你的类名

第三个是参数生成器

参数生成器 功能
Values(a,b,...) 依次取a,b,...
ValuesIn(container) 依次取容器中的值
ValuesIn(begin, end) 依次取begin在end中的值
Bool() 生成false,true
Range(start,end,step) 类似py的range
Combine(g1,g2,...) 组合生成器g1,g2,...,返回tuple<类型1,类型2,...>,需要#includ<tuple>

如果需要事件(如teardown)可以直接在类中写,不用继承testing::test以及使用TEST_F 

 

 

类型参数化,没怎么看懂,以后再说

#include <iostream>
#include <gtest/gtest.h>
#include <string>
#include <vector>
#include <tuple>

bool isPrime1(int x){
    if(x<2)return false;
    if(x==2||x==3)return true;
    if(x%6!=1&&x%6!=5)return false;
    for(int i=5;i*i<=x;i+=6){
        if(x%i==0||x%(i+2)==0)return false;
    }
    return true;
}

bool isPrime2(int x){
    if(x<2)return false;
    for(int i=2;i*i<=x;++i){
        if(x%i==0)return false;
    }
    return true;
}

class IsPrimeParamTest:public testing::TestWithParam<int>{
};
//INSTANTIATE_TEST_CASE_P(TrueReturn, IsPrimeParamTest, testing::Values(3, 5, 11, 23, 17));

//第一个参数是测试案例的前缀,可以任意取,但是当第二个参数相同时,第一个参数必须不同
//第二个参数是测试案例的名称,需要和之前定义的参数化的类的名称相同,如:IsPrimeParamTest
//第三个参数是可以理解为参数生成器,上面的例子使用test::Values表示使用括号内的参数。Google提供了一系列的参数生成的函数:
//Values(a,b,c,...)依次取a,b,c...
INSTANTIATE_TEST_SUITE_P(TrueReturn1, IsPrimeParamTest, testing::Values(3, 5, 11, 23, 17));


//Range,类似py的range
INSTANTIATE_TEST_SUITE_P(TrueReturn2,IsPrimeParamTest,testing::Range(1,10001,1));


int a[]{3,5,11,23,17};
//ValuesIn,容器
INSTANTIATE_TEST_SUITE_P(TrueReturn3,IsPrimeParamTest,testing::ValuesIn(a));

//ValuesIn,迭代器
std::vector<int> v{1,2,4,5,6};
INSTANTIATE_TEST_SUITE_P(TrueReturn4,IsPrimeParamTest,testing::ValuesIn(v.begin(),v.end()));


TEST_P(IsPrimeParamTest,test1){
    int n=GetParam();
    ASSERT_EQ(isPrime2(n),isPrime1(n));
}


class BoolTest:public testing::TestWithParam<bool>{
};
//Bool,返回true,false
INSTANTIATE_TEST_SUITE_P(TrueReturn1,BoolTest,testing::Bool());
TEST_P(BoolTest,test1){
    bool n=GetParam();
    ASSERT_EQ(true,n);
}

class CombineTest:public testing::TestWithParam<std::tuple<int,int,int> >{

};
//Combine,进行排列组合,里面每个参数都是一个参数生成器(也许能套娃,但是我懒得试了),GetParam会返回tuple
//需要#include<tuple>
INSTANTIATE_TEST_SUITE_P(
        TrueReturn1,
        CombineTest,
        testing::Combine(
                testing::ValuesIn(a),
                testing::ValuesIn(v),
                testing::Range(1,5)));
TEST_P(CombineTest,test1){
    std::tuple<int,int,int> p=GetParam();
    //用std::get<0>获取第0个参数
    EXPECT_NE(std::get<0>(p)+std::get<1>(p),std::get<2>(p)+std::get<1>(p));
}


//还有个类型参数化,没怎么看懂,以后再说

int main(int argc, char **argv)
{
    testing::InitGoogleTest(&argc, argv);

    return RUN_ALL_TESTS();
}

运行参数

   
--gtest_list_tests 使用这个参数时,将不会执行里面的测试案例,而是输出一个案例的列表
--gtest_filter

对执行的测试案例进行过滤,支持通配符

?    单个字符

*    任意字符

-    排除,如,-a 表示除了a

:    取或,如,a:b 表示a或b

--gtest_repeat=[COUNT]

-1 无限次

--gtest_color=(yes|no|auto) 输出命令行时是否使用一些五颜六色的颜色。默认是auto,这个好像在clion的控制台没有什么卵用
--gtest_print_time 输出命令行时是否打印每个测试案例的执行时间。默认是不打印的。但是好像clion中,是默认打印的
--gtest_output=xml[:DIRECTORY_PATH\|:FILE_PATH]

将测试结果输出到一个xml中

不指定输出路径时,默认为案例当前路径。

--gtest_break_on_failure 当案例失败时停止

其他的再说吧

有两种方法,一种是在main中,用testing::GTEST_FLAG(),

如gtest_list_tests,把gtest这个前缀去掉,放括号里

int main(int argc, char **argv)
{
    //--gtest_list_tests
    testing::GTEST_FLAG(list_tests) = "";
    testing::InitGoogleTest(&argc, argv);

    return RUN_ALL_TESTS();
}

 另一种是直接在clion中指定

 

参考

https://www.cnblogs.com/coderzh/archive/2009/04/06/1426755.html

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

gTest 学习 的相关文章

  • expr命令用法-实例讲解

    expr命令是一个手工命令行计数器 用于在UNIX LINUX下求表达式变量的值 一般用于整数值 也可用于字符串 格式为 expr Expression 命令读入Expression 参数 计算它的值 然后将结果写入到标准输出 参数应用规则
  • One PUNCH Man——深度学习入门

    文章目录 人类视觉原理 从神经网络到卷积神经网络 CNN 数据输入层 卷积计算层 卷积的计算 参数共享机制 激励层 池化层 全连接层 CNN优缺点 卷积神经网络的常用框架 人类视觉原理 深度学习的许多研究成果 离不开对大脑认知原理的研究 尤
  • java mail 通过 freemarker 发送邮件

    java mail 通过 freemarker 发送邮件 理解 java mail 核心类 1 MimeMessage 对象就是一封邮件 2 Session 定义系统属性信息 具体代码如下 1 controller 层代码如下 packag
  • ubuntu 下切换窗口

    通过 alt tab 键 在所有打开的程序之前切换 在切换过程中 如果遇到已经打开多个窗口的程序 可以按 alt 键 组合键 转入一个程序所有窗口中 循环切换 转载于 https www cnblogs com zach0812 p 115
  • C# 的文件读写方式汇总(学习心得 27)

    当打开文件进行读写时 它变成一个 流 从根本上说 流是通过通信路径传递的字节序列 有两个主要的流 输入流 和 输出流 输入流用于从文件读取数据 读操作 输出流用于向文件写入数据 写操作 超级小白友好 讲解C 基础 每集5分钟轻松学习 拒绝从
  • pta找完数问题,我想知道哪错了,pta上显示有两处答案错误,谢谢

    include
  • 2018/12/19统计字符出现字数

    本题要求编写程序 统计并输出某给定字符在给定字符串中出现的次数 输入格式 输入第一行给出一个以回车结束的字符串 少于80个字符 第二行输入一个字符 输出格式 在一行中输出给定字符在给定字符串中出现的次数 输入样例 programming i
  • MSF图形化界面Viper(炫彩蛇)下载与使用

    Viper 炫彩蛇 是一款图形化内网渗透工具 将内网渗透过程中常用的战术及技术进行模块化及武器化 Viper 炫彩蛇 集成杀软绕过 内网隧道 文件管理 命令行等基础功能 Viper 炫彩蛇 当前已集成70 个模块 覆盖初始访问 持久化 权限
  • zsh: command not found: brew

    问题 已经安装好Homebrew 命令行查看brew v 显示zsh command not found brew 解决方案 打开 如不存在此文件会自动创建 vim zshrc 在里面添加一行 export PATH opt homebre
  • 【数据结构】手把手带你搞懂顺序表(带图详解)

    文章目录 前言 1 顺序表 1 1 顺序表的结构体 1 2 功能实现 初始顺序表 增加顺序表长度 顺序表的查找 顺序表的插入 顺序表的删除 打印顺序表 顺序表的销毁 1 3 顺序存储结构的优缺点 顺序表总代码 前言 在本篇博客中 我会概述顺
  • 12.20 摄像机跟随玩家

    public class CameraFollow MonoBehaviour Transform player float up 11 away 17 Vector3 pos float speed 3f void Start playe
  • 基于JSP的网络超市商品销售管理系统的毕业设计与实现

    论文题目 基于JSP的网络超市商品销售管理系统的毕业设计与实现 摘要 随着电子商务的快速发展 网络超市已经成为人们购物的重要途径之一 本文基于JSP Java Server Pages 技术 设计了一个网络超市商品销售管理系统 旨在提供一个
  • BUUCTF,Web:[极客大挑战 2019]Havefun

    无其他可动项 先看源码 cat GET cat echo cat if cat dog echo Syc cat cat cat cat get 传 cat dog 得到 flag
  • datagrip插入汉字报错

    1 datagrip报错信息 HY000 1366 Incorrect string value xE5 xA4 xA7 xE5 xB8 x88 for column name at row 1 2 原因 编码格式有问题 建立表的时候不能插
  • 多线程之间实现通讯

    多线程之间如何实现通讯 什么是多线程之间通讯 多线程之间通讯 其实就是多个线程在操作同一个资源 但是操作的动作不同 画图如下 我这里有个例子 就是弄两个线程 一个进行写 一个进行读 写的话 如果是偶数 就是java 男 如果是奇数 就是ph
  • c++编写消消乐游戏

    include
  • AR基础讲解:打造AR元宇宙博物馆编程之旅

    AR基础讲解 打造AR元宇宙博物馆编程之旅 随着技术的不断发展 增强现实 AR 正逐渐成为各个领域的热门技术 而在AR中 构建一个全新的虚拟世界 AR元宇宙博物馆 使我们能够透过手机或其他AR设备与数字内容进行互动 本文将为大家介绍如何使用
  • 美国病毒systemd占用100%,root密码登录卡死

    1 top 查看到有僵尸进程一直启动 2 lsof p 752 查看进程的来源 3 crontab l 查看定时任务 是否有自动启动
  • C语言网络编程(二)建立套接字通讯UDP

    所谓socket套接字 指的是在网络通信以前建立的通信接口 进行网络连接以前 需要向系统注册申请一个新的socket 然后使用这个socket进行网络连接 提示 套接字 传输层协议 端口号 IP地址 在进行网络连接以前 需要用socket函
  • 代码随想录算法训练营19期第57天

    647 回文子串 代码随想录 初步思路 动态规划 总结 dp i j 表示区间范围 i j 注意是左闭右闭 的子串是否是回文子串 当 s i s j 时 需要判断 dp i 1 j 1 是不是一个回文串 if s i s j j i lt

随机推荐

  • 3分钟搞懂js的冒泡和捕获?

    为了快速理解js冒泡和捕获 我们先看代码
  • 桌前检查、代码评审、走查

    桌前检查 Disk Checking 这是一种传统的检查方法 由程序员检查自己编写的程序 程序员在程序通过编译之后 进行单元测试之前 对源程序代码进行分析 检验 并补充相关的文档 目的是发现程序中的错误 检查项目有 1 检查变量的交叉引用表
  • 浅谈3NF(范式)建模

    范式 一张数据表的表结构所符合的某种设计标准的级别 构造数据库必须遵循一定的规则 在关系型数据库中 这种规则就是范式 范式是符合某一种级别的关系模式的集合 目前关系数据库有六种范式 第一范式 1NF 第二范式 2NF 第三范式 3NF 第四
  • Pycharm及python安装详细教程(图解)

    更多编程教程请到 菜鸟教程 https www piaodoo com 友情链接 好看站 http www nrso net 首先我们来安装python 1 首先进入网站下载 点击打开链接 或自己输入网址https www python o
  • java类是公共的应当声明,java 类是公共的,应在名为.java 的文件中声明

    java 类是公共的 应在名为 java 的文件中声明 关注 162 答案 2 mip版 解决时间 2021 01 16 12 24 提问者关系已逝 2021 01 15 16 19 import javax swing JOptionPa
  • ajax中中loaddate,jQuery中ajax的load()与post()方法实例详解

    本文实例讲述了jQuery中ajax的load 与post 方法 分享给大家供大家参考 具体如下 一 load 方法 在jQuery ajax的load 方法能够载入远程 HTML 文件代码并插入至 DOM 中 这个与post get还是有
  • 数据结构与算法(九)-- 队列

    队列 队列的定义 它只允许在表的前端 front 进行删除操作 而在表的后端 rear 进行插入操作 进行插入操作的端称为队尾 进行删除操作的端称为队头 顺序队 采用顺序存储结构的队列 存储空间连续 front指向对头元素 rear 指向队
  • 利用Dom4j创建xml文档

    DocumentHelper是使用Dom4j的辅助类的集合 利用它我们可以创建xml文档 接下来我们就使用它来创建一个简单的xml文档 创建文档 第一种方式 Document document DocumentHelper createDo
  • 20200317_决策树预测贷款申请

    使用决策树 预测贷款申请 import pandas as pd 忽略弹出的warnings import warnings warnings filterwarnings ignore text pd read excel data Lo
  • 前导0 的数字

    代码和任务 copyright c 2015 csdn学院 All right reserved 文件名称 main c 作者 张如田 完成日期 版本号 任务描述 输入小时和分 以hh mm形式输出 其中小时和分钟不足两位数时 用零前导 例
  • 手动下载Python第三方库whl文件并进行安装

    手动下载Python第三方库whl文件并进行安装 在Python开发中 我们经常需要使用第三方库来辅助我们完成各种任务 而通常在安装这些库时 我们会使用pip命令进行安装 但有时候因为网络环境等原因 pip无法正常工作 导致我们无法安装所需
  • Ubuntu上交叉编译opencv及opencv_contrib并移植到ARM板之一

    完整人脸识别系统 源码 教程 环境 开源毕业设计 基于嵌入式ARM Linux的应用OpenCV和QT实现的人脸识别系统 源码 论文 完全毕设教程 Linux上Opencv与Qt实现的人脸识别的考勤点名 门禁系统 PC与嵌入式ARM版本 零
  • I2C通信基本原理及其实现

    I2C是一种总线式结构 它只需要SCL时钟信号线与SDA数据线 两根线就能将连接与总线上的设备实现数据通信 由于它的简便的构造设计 于是成为一种较为常用的通信方式 由于I2C采用的是主从式通信方式 所以 通信的过程完全由主设备仲裁 在通信之
  • 蓝桥杯2019年第十届省赛真题-扫地机器人

    题目 题目链接 题解 二分 贪心 二分模板 看到这道题第一时间想到的就是二分和动规 仔细一看二分有戏 能check出来 所以决定用二分好好想想 主要是因为我动规太菜了 怕了 二分时间 准确的说我们二分的不是时间 而是覆盖范围 也就是枚举每个
  • 《Python编程:从入门到实践》学习笔记——第11章 测试代码

    文章目录 前言 1 测试函数 1 1 单元测试和测试用例 1 2 可通过的测试 1 3 不能通过的测试 1 4 测试未通过时怎么办 1 5 添加新测试 2 测试类 2 1 各种断言方法 2 2 一个要测试的类 2 3 测试 Anonymou
  • 【机器学习】随机森林预测并可视化特征重要性

    今天需要用到特征重要性的分析 所以干脆就写一下使用随机森林是如何做建模并基于随机森林做特征重要性的分析 顺带给出了编码方式 随机森林 特征重要性可视化的完整Python代码 都是可以直接运行的 目 录 1 分类型特征编码 1 1 Label
  • cmd 命令行显示中文乱码

    cmd命令行显示中文乱码多数是由于字符编码不匹配导致 1 查看cmd编码方式 方法一 打开cmd 输入chcp命令回车 显示默认编码 活动代码页 936指GBK 方法二 打开cmd在标题栏单击鼠标右键选择 属性 在属性选项中可看到当前编码方
  • JAVA的OPENGL,JOGL入门实例----不断变色的点阵 (源代码)

    原文 http blog csdn net sidihuo article details 44035015 第一个类 代码解读 java view plain copy package test1 opengl import java a
  • AirtestIDE学习笔记---安装(windows系统)

    这篇写的更详细点 https blog csdn net u013405658 article details 99443091 Airtest之前有听到过这样的工具 一直没有小试牛刀 直到上周参加了TesterHome社区组织的测试开发者
  • gTest 学习

    gTest 目录 在Clion上安装 断言 判断bool 数值判断 字符串判断 显示返回成功或失败 异常检查 输出更详细信息 自定义输出 浮点数相等 相近判断 事件 全局事件 TestSuite事件 TestCase事件 参数化 在Clio