软件验证

软件验证检查软件产品是否满足或适合预期用途,即软件满足用户要求,而不是仅会操作软件的用户的需要; 但是,作为所有利益相关者(例如用户,操作员,管理员,经理,投资者等)的需求。

有两种执行软件验证的方法:内部和外部。

如果软件符合要求规范,则表明该软件已经过内部验证。 通过询问利益相关者软件是否满足他们的需求来执行外部验证。

当所有利益相关者都接受该软件产品并表示其满足他们的需求时,便会成功进行最终的外部验证。

黑匣子测试

黑匣子测试是一种软件测试方法,其中测试人员不知道被测项目的内部结构/设计/实现。 例如。 验收测试,系统测试

白盒测试

白盒测试是一种软件测试方法,其中测试人员可以了解被测项目的内部结构/设计/实现。 例如。 单元测试,集成测试

单元测试

单元是软件中最小的可测试部分。 它通常只有一个或几个输入,通常只有一个输出。 在过程编程中,一个单元可以是单独的程序,函数,过程等。在面向对象的编程中,最小的单元是一种方法,可以属于基础/超类,抽象类或派生/子类。

整合测试

集成测试是软件测试的级别,其中各个单元组合在一起并作为一组进行测试。 此测试级别的目的是暴露集成单元之间交互中的错误。

系统测试

测试集成系统以验证其是否符合指定要求的过程
要求。

验收测试

该测试的目的是评估系统是否符合要求,是否可以交付。

为什么要编写单元测试?

  • 加快开发速度(测试驱动开发与Debug以后的开发)
  • 更快地发现错误
  • 防止错误重新出现
  • 改善软件设计(编写单元测试需要松散耦合)

松散耦合系统是其中每个组件几乎不了解其他单独组件的定义的系统。

C ++和Boost.Test中的单元测试

如果在一个程序中有很多测试用例,那么它们的维护可能会很困难。 与其他框架一样,Boost.Test允许将多个测试用例分组到测试套件中-这允许以更简单的方式使用它们。

  BOOST_AUTO_TEST_SUITE(suite1) 

BOOST_AUTO_TEST_CASE(test1){
BOOST_CHECK_EQUAL(2 + 2,4);
}

BOOST_AUTO_TEST_CASE(test2){
BOOST_CHECK_EQUAL(2 * 2,4);
}

BOOST_AUTO_TEST_SUITE_END()

基本宏( BOOST_WARNBOOST_CHECKBOOST_REQUIRE )仅接受一个参数-要检查的表达式,如下所示:

  BOOST_WARN(sizeof(int)== sizeof(short)); 
BOOST_CHECK(i == 1);
BOOST_REQUIRE(i> 5);

C ++的模拟框架

Google模拟遵循标准的模拟工作流程:

  • 为给定的类创建一个模拟对象-有许多宏可以声明模拟函数。 还有一个工具可以从您的源代码生成模拟定义。
  • 您创建将使用模拟类的测试用例,并在其中执行以下操作:
  • 创建模拟对象并对其设置期望 。 有许多不同的宏和函数,因此您可以设置几乎任意的场景;
  • 调用要测试的函数,并将模拟对象作为参数传递给它们(或者您可以创建一些对象,并将模拟对象设置为其成员,以供其功能使用);
  • 在销毁模拟对象时,Google模拟库会根据实际结果检查期望值,如果未达到期望值,它将通过抛出异常报告错误并打印出失败的期望值。

我们需要上课,我们要嘲笑。 这应该是虚拟类,因此Google模拟将能够覆盖其中的方法:

  PropHolder类{ 
上市:
PropHolder(){}
虚拟〜PropHolder(){}

虚拟void SetProperty(const std :: string&name,int value)= 0;
virtual int GetProperty(const std :: string&name)= 0;
};

该类将由另一个类中的函数使用,该类将存储对基类PropHolder实例的引用:

 类TestClass { 
上市:
TestClass(PropHolder&ph):fPropHolder(ph){}
无效doCalc(){
如果(fPropHolder.GetProperty(std :: string(“ test”)))> 100){
fPropHolder.SetProperty(“ test2”,555);
}其他
fPropHolder.SetProperty(“ test2”,785);
}
私人的:
PropHolder&fPropHolder;
};

现在我们需要创建一个PropHolder类,该类继承自PropHolder ,并使用宏来实现相应的存根。 Google模拟提供了不同的宏MOCK_METHODNMOCK_CONST_METHODN ,其中最后N应与模拟函数的参数数量匹配。 这些宏的第一个参数是要模拟的方法的名称,第二个是函数的签名:

  MockPropHolder类:公共PropHolder { 
上市:
MockPropHolder(){}
虚拟〜MockPropHolder(){}
  MOCK_METHOD2(SetProperty,void(const std :: string&name,int value)); 
MOCK_METHOD1(GetProperty,int(const std :: string&name));
};

现在我们可以在测试中使用模拟类了。 我们创建了一个名为mholder类实例,并将mholder设定期望。 首先期望的是,函数GetProperty将使用参数"test"被调用一次,并且模拟对象应为此调用返回101 。 第二个期望值指定将使用两个参数( "test2"555调用SetProperty函数。 设置期望值后,我们创建TestClass的实例,并将对模拟对象的引用传递给它。 最后一行-调用函数doCalc ,该函数使用PropHolder类中的函数:

  BOOST_AUTO_TEST_CASE(test_gmock){ 
使用:: testing :: Return;
  MockPropHolder mholder; 
EXPECT_CALL(mholder,GetProperty(std :: string(“ test”))))。Times(1).WillOnce(Return(101));
EXPECT_CALL(mholder,SetProperty(std :: string(“ test2”),555));
  TestClass t(mholder); 
t.doCalc();
}

资料来源:http://alexott.net/en/cpp/CppTestingIntro.html