关于CppUnit里面宏的介绍

使用CppUnit进行单元测试 一. CppUnit的安装      从http://sourceforge.net/projects/cppunit   CppUnit的源码包. CppUnit是开源产品 , 当前最高版本为1.11.0. (在上面的链接所指向的页面上选择 Development Snapshot ).        下载后,将源码包解压缩到本地硬盘. 以C:为例, 解压到C:/CppUnit-1.11.0 . 阅读详情

本文是讨论开放源码单元测试工具的 系列文章 的第 2 篇,介绍非常受欢迎的 CppUnit — 最初由 Eric Gamma 和 Kent Beck 开发的 JUnit 测试框架的 C++ 版本。C++ 版本由 Michael Feathers 创建,它包含许多类,有助于进行白盒测试和创建自己的回归测试套件。本文介绍一些比较有用的 CppUnit 特性,比如 TestCase、TestSuite、TestFixture、TestRunner 和辅助宏。

常用缩写词

  • GUI:图形用户界面
  • XML:可扩展标记语言

下载和安装 CppUnit

对于本文,我在一台 Linux® 机器(内核 2.4.21)上用 g++-3.2.3 和 make-3.79.1 下载并安装了 CppUnit。安装过程很简单,是标准的:运行 configure 命令,然后运行 make 和 make install。注意,对于 cygwin 等平台,这个过程可能无法顺利地完成,所以一定要通过 INSTALL-unix 文档了解详细的安装信息。如果安装成功,应该会在安装路径(CPPUNIT_HOME)中看到 CppUnit 的 include 和 lib 文件夹。清单 1 给出文件夹结构。


清单 1. CppUnit 安装目录结构
				
[arpan@tintin] echo $CPPUNIT_HOME
/home/arpan/ibm/cppUnit
[arpan@tintin] ls $CPPUNIT_HOME
bin  include  lib  man  share

要想编译使用 CppUnit 的测试,必须构建源代码:

g++ <C/C++ file> -I$CPPUNIT_HOME/include –L$CPPUNIT_HOME/lib -lcppunit

注意,如果是使用 CppUnit 的共享库版本,可能需要使用 –ldl 选项编译源代码。安装之后,还可能需要修改 UNIX® 环境变量 LD_LIBRARY_PATH 以反映 libcppunit.so 的位置。

使用 CppUnit 创建基本测试

学习 CppUnit 的最佳方法是创建一个叶级测试(leaf level test)。CppUnit 附带一整套预先定义的类,可以用它们方便地设计测试。为了保持连续性,先回顾一下本系列 第 1 部分 中讨论过的字符串类(见 清单 2)。


清单 2. 简单的字符串类
				
#ifndef _MYSTRING
#define _MYSTRING

class mystring { 
  char* buffer; 
  int length;
  public: 
    void setbuffer(char* s) { buffer = s; length = strlen(s); } 
    char& operator[ ] (const int index) { return buffer[index]; }
    int size( ) { return length; }
 }; 

#endif

与字符串相关的典型检查包括检查空字符串的长度是否为 0 以及访问范围超出索引是否导致错误消息/异常。清单 3 使用 CppUnit 执行这些测试。


清单 3. 字符串类的单元测试
				
#include <cppunit/TestCase.h>
#include <cppunit/ui/text/TextTestRunner.h>

class mystringTest : public CppUnit::TestCase {
public:

  void runTest() {
    mystring s;
    CPPUNIT_ASSERT_MESSAGE("String Length Non-Zero", s.size() != 0);
  }
};

int main ()
{
  mystringTest test;
  CppUnit::TextTestRunner runner;
  runner.addTest(&test);

  runner.run();
  return 0;
}

要学习的第一个 CppUnit 类是 TestCase。要想为字符串类创建单元测试,需要创建 CppUnit::TestCase 类的子类并覆盖 runTest 方法。定义了测试本身之后,实例化 TextTestRunner 类,这是一个控制器类,必须在其中添加测试(vide addTest 方法)。清单 4 给出 run 方法的输出。


清单 4. 清单 3 中代码的输出
				
[arpan@tintin] ./a.out
!!!FAILURES!!!
Test Results:
Run:  1   Failures: 1   Errors: 0


1) test:  (F) line: 26 try.cc
assertion failed
- Expression: s.size() == 0
- String Length Non-Zero

为了确认断言确实起作用了,把 CPPUNIT_ASSERT_MESSAGE 宏中的条件改为相反的条件。清单 5 给出条件改为 s.size() ==0 之后代码的输出。


清单 5. 条件改为 s.size( ) == 0 之后清单 3 中代码的输出
				
[arpan@tintin] ./a.out

OK (1 tests)

注意,TestRunner 并非运行单一测试或测试套件的惟一方法。CppUnit 还提供另一个类层次结构 — 即模板化的 TestCaller 类。可以不使用 runTest 方法,而是使用 TestCaller 类执行任何方法。清单 6 提供一个小示例。


清单 6. 使用 TestCaller 运行测试
				
class ComplexNumberTest ... { 
  public: 
     void ComplexNumberTest::testEquality( ) { … } 
};

CppUnit::TestCaller<ComplexNumberTest> test( "testEquality", 
                                             &ComplexNumberTest::testEquality );
CppUnit::TestResult result;
test.run( &result );

在上面的示例中,定义了一个类型为 ComplexNumberText 的类,其中包含 testEquality 方法(测试两个复数是否相等)。用这个类对 TestCaller 进行模板化,与使用 TestRunner 时一样,通过调用 run 方法执行测试。但是,这样使用 TestCaller 类意义不大:TextTestRunner 类会自动显示输出。而在使用 TestCaller 时,必须使用另一个类处理输出。在本文后面使用 TestCaller 类定义定制的测试套件时,您会看到这种代码。

使用断言


清单 7. CPPUNIT_ASSERT_MESSAGE 的定义
				
#define CPPUNIT_ASSERT_MESSAGE(message,condition)                          \
  ( CPPUNIT_NS::Asserter::failIf( !(condition),                            \
                                  CPPUNIT_NS::Message( "assertion failed", \
                                                       "Expression: "      \
                                                       #condition,         \
                                                       message ),          \
                                  CPPUNIT_SOURCELINE() ) )

清单 8 给出这个断言使用的 failIf 方法的声明。


清单 8. failIf 方法的声明
				
struct Asserter
{
…
  static void CPPUNIT_API failIf( bool shouldFail,
                                  const Message &message,
                                  const SourceLine &sourceLine = SourceLine() );
…
}

如果 failIf 方法中的条件为真,就会抛出一个异常。run 方法在内部处理该过程。另一个有意思、有用的宏是 CPPUNIT_ASSERT_DOUBLES_EQUAL,它使用一个容差值检查两个双精度数是否相等(即 |expected – actual | ≤ delta)。清单 9 给出宏定义。


清单 9. CPPUNIT_ASSERT_DOUBLES_EQUAL 宏定义
				
void CPPUNIT_API assertDoubleEquals( double expected,
                                     double actual,
                                     double delta,
                                     SourceLine sourceLine,
                                     const std::string &message );
#define CPPUNIT_ASSERT_DOUBLES_EQUAL(expected,actual,delta)        \
  ( CPPUNIT_NS::assertDoubleEquals( (expected),            \
                                    (actual),              \
                                    (delta),               \
                                    CPPUNIT_SOURCELINE(),  \
                                    "" ) )

再次测试字符串类

为了测试 mystring 类的其他方面,可以在 runTest 方法中添加更多检查。但是,这么做很快就会变得难以管理了,除非是最简单的类。这时就需要定义和使用测试套件。清单 10 为字符串类定义一个测试套件。


清单 10. 为字符串类定义测试套件
				
#include <cppunit/extensions/TestFactoryRegistry.h>
#include <cppunit/ui/text/TextTestRunner.h>
#include <cppunit/extensions/HelperMacros.h>

class mystringTest : public CppUnit::TestCase {
public:
  void checkLength() {
    mystring s;
    CPPUNIT_ASSERT_MESSAGE("String Length Non-Zero", s.size() == 0);
  }

  void checkValue() {
    mystring s;
    s.setbuffer("hello world!\n");
    CPPUNIT_ASSERT_EQUAL_MESSAGE("Corrupt String Data", s[0], 'w');
  }

  CPPUNIT_TEST_SUITE( mystringTest );
  CPPUNIT_TEST( checkLength );
  CPPUNIT_TEST( checkValue );
  CPPUNIT_TEST_SUITE_END();
};

这很简单。使用 CPPUNIT_TEST_SUITE 宏定义测试套件。mystringTest 类中的方法形成测试套件中的单元测试。我们稍后研究这些宏及其内容,但是先看看使用这个测试套件的客户机代码(见 清单 11)。


清单 11. 使用 mystring 类的测试套件的客户机代码
				
CPPUNIT_TEST_SUITE_REGISTRATION ( mystringTest );

int main ()
{
  CppUnit::Test *test =
    CppUnit::TestFactoryRegistry::getRegistry().makeTest();
  CppUnit::TextTestRunner runner;
  runner.addTest(test);

  runner.run();
  return 0;
}

清单 12 给出运行 清单 11 时的输出。


清单 12. 清单 10 和清单 11 中代码的输出
				
[arpan@tintin] ./a.out
!!!FAILURES!!!
Test Results:
Run:  2   Failures: 2   Errors: 0


1) test: mystringTest::checkLength (F) line: 26 str.cc
assertion failed
- Expression: s.size() == 0
- String Length Non-Zero


2) test: mystringTest::checkValue (F) line: 32 str.cc
equality assertion failed
- Expected: h
- Actual  : w
- Corrupt String Data

CPPUNIT_ASSERT_EQUAL_MESSAGE 的定义在头文件 TestAssert.h 中,它检查预期参数和实际参数是否匹配。如果不匹配,就显示指定的消息。在 HelperMacros.h 中定义的 CPPUNIT_TEST_SUITE 宏可以简化创建测试套件并在其中添加测试的流程。在内部创建一个 CppUnit::TestSuiteBuilderContext 类型的模板化对象(这是 CppUnit 上下文中的测试套件),每个 CPPUNIT_TEST 调用在套件中添加相应的类方法。类方法作为代码的单元测试。请注意宏的次序:编译各个 CPPUNIT_TEST 宏的代码必须在 CPPUNIT_TEST_SUITE 和 CPPUNIT_TEST_SUITE_END 宏之间。

组织新测试

随着时间的推移,开发人员会不断添加功能,这些功能也需要测试。在同一测试套件中不断添加测试会逐渐造成混乱,而且对首次测试的修改容易随着修改的不断增加而丢失。好在 CppUnit 提供一个有用的 CPPUNIT_TEST_SUB_SUITE 宏,可以使用它扩展现有的测试套件。清单 13 使用这个宏。


清单 13. 扩展测试套件
				
class mystringTestNew : public mystringTest {
public:
  CPPUNIT_TEST_SUB_SUITE (mystringTestNew, mystringTest);
  CPPUNIT_TEST( someMoreChecks );
  CPPUNIT_TEST_SUITE_END();

  void someMoreChecks() {
    std::cout << "Some more checks...\n";
  }
};

CPPUNIT_TEST_SUITE_REGISTRATION ( mystringTestNew );

注意,新的类 mystringTestNew 是从前面的 myStringTest 类派生的。CPPUNIT_TEST_SUB_SUITE 宏的两个参数是新的类和它的超类。在客户端,只注册这个新类,不需要注册两个类。语法的其他部分与创建测试套件的语法相同。

使用 fixtures 定制测试

在 CppUnit 上下文中,fixture 或 TestFixture 用于为各个测试提供简洁的设置和退出例程。要想使用 fixture,测试类应该派生自 CppUnit::TestFixture 并覆盖预先定义的 setUp 和 tearDown 方法。在执行单元测试之前调用 setUp 方法,在测试执行完时调用 tearDown。清单 14 演示如何使用 TestFixture。


清单 14. 使用测试 fixture 定制测试套件
				
#include <cppunit/extensions/TestFactoryRegistry.h>
#include <cppunit/ui/text/TextTestRunner.h>
#include <cppunit/extensions/HelperMacros.h>

class mystringTest : public CppUnit::TestFixture {
public:
  void setUp() { 
     std::cout << “Do some initialization here…\n”;
  }

  void tearDown() { 
      std::cout << “Cleanup actions post test execution…\n”;
  }

  void checkLength() {
    mystring s;
    CPPUNIT_ASSERT_MESSAGE("String Length Non-Zero", s.size() == 0);
  }

  void checkValue() {
    mystring s;
    s.setbuffer("hello world!\n");
    CPPUNIT_ASSERT_EQUAL_MESSAGE("Corrupt String Data", s[0], 'w');
  }

  CPPUNIT_TEST_SUITE( mystringTest );
  CPPUNIT_TEST( checkLength );
  CPPUNIT_TEST( checkValue );
  CPPUNIT_TEST_SUITE_END();
};

清单 15 给出 清单 14 中代码的输出。


清单 15. 清单 14 中代码的输出
				
[arpan@tintin] ./a.out
. Do some initialization here…
FCleanup actions post test execution…
. Do some initialization here…
FCleanup actions post test execution…

!!!FAILURES!!!
Test Results:
Run:  2   Failures: 2   Errors: 0


1) test: mystringTest::checkLength (F) line: 26 str.cc
assertion failed
- Expression: s.size() == 0
- String Length Non-Zero


2) test: mystringTest::checkValue (F) line: 32 str.cc
equality assertion failed
- Expected: h
- Actual  : w
- Corrupt String Data

正如在输出中看到的,每次执行单元测试都会显示设置和清除例程消息。

创建不使用宏的测试套件

可以创建不使用任何辅助宏的测试套件。这两种风格并没有明显的优劣,但是无宏风格的代码更容易调试。要想创建不使用宏的测试套件,应该实例化 CppUnit::TestSuite,然后在套件中添加测试。最后,把套件本身传递给 CppUnit::TextTestRunner,然后再调用 run 方法。客户端代码很相似,见 清单 16。


清单 16. 创建不使用辅助宏的测试套件
				
int main ()
{
  CppUnit::TestSuite* suite = new CppUnit::TestSuite("mystringTest");
  suite->addTest(new CppUnit::TestCaller<mystringTest>("checkLength",
                &mystringTest::checkLength));
  suite->addTest(new CppUnit::TestCaller<mystringTest>("checkValue",
                &mystringTest::checkLength));

  // client code follows next 
  CppUnit::TextTestRunner runner;
  runner.addTest(suite);

  runner.run();
  return 0;
}

要想理解 清单 16,需要理解 CppUnit 名称空间中的两个类:TestSuite 和 TestCaller(分别在 TestSuite.h 和 TestCaller.h 中声明)。在执行 runner.run() 调用时,对于每个 TestCaller 对象,在 CppUnit 内部调用 runTest 方法,它进而调用传递给 TestCaller<mystringTest> 构造函数的例程。清单 17 中的代码(取自 CppUnit 源代码)说明如何为每个套件调用测试。


清单 17. 执行套件中的测试
				
void
TestComposite::doRunChildTests( TestResult *controller )
{
  int childCount = getChildTestCount();
  for ( int index =0; index < childCount; ++index )
  {
    if ( controller->shouldStop() )
      break;

    getChildTestAt( index )->run( controller );
  }
}

TestSuite 类派生自 CppUnit::TestComposite。

理解 CppUnit 中的指针

一定要在堆上声明测试套件,因为 CppUnit 在内部在 TestRunner 销毁函数中删除 TestSuite 指针。但是,这可能不是最好的设计决策,而且在 CppUnit 文档中未被提及。

运行多个测试套件

可以创建多个测试套件并使用 TextTestRunner 在一个操作中运行它们。只需像 清单 16 那样创建每个测试套件,然后使用 addTest 方法把它们添加到 TextTestRunner 中,见 清单 18。


清单 18. 使用 TextTestRunner 运行多个套件
				
CppUnit::TestSuite* suite1 = new CppUnit::TestSuite("mystringTest");
suite1->addTest(…);
…
CppUnit::TestSuite* suite2 = new CppUnit::TestSuite("mymathTest");
…
suite2->addTest(…);
CppUnit::TextTestRunner runner;
runner.addTest(suite1);
runner.addTest(suite2);
…

定制输出的格式

到目前为止,测试的输出都是由 TextTestRunner 类默认生成的。但是,CppUnit 允许使用定制的输出格式。用于实现这个功能的类之一是 CompilerOutputter(在头文件 CompilerOutputter.h 中声明)。这个类允许指定输出中文件名-行号信息的格式。另外,可以把日志直接保存到文件中,而不是发送到屏幕。清单 19 提供一个把输出转储到文件的示例。注意格式 %p:%l:前者表示文件的路径,后者表示行号。使用这种格式时的典型输出像 /home/arpan/work/str.cc:26 这样。


清单 19. 把测试输出转发到日志文件并采用定制的格式
				
#include <cppunit/extensions/TestFactoryRegistry.h>
#include <cppunit/ui/text/TextTestRunner.h>
#include <cppunit/extensions/HelperMacros.h>
#include <cppunit/CompilerOutputter.h>

int main ()
{
  CppUnit::Test *test =
    CppUnit::TestFactoryRegistry::getRegistry().makeTest();
  CppUnit::TextTestRunner runner;
  runner.addTest(test);

  const std::string format("%p:%l");
  std::ofstream ofile;
  ofile.open("run.log");
  CppUnit::CompilerOutputter* outputter = new
    CppUnit::CompilerOutputter(&runner.result(), ofile);
  outputter->setLocationFormat(format);
  runner.setOutputter(outputter);

  runner.run();
  ofile.close();
  return 0;
}

CompilerOutputter 还有很多其他有用的方法,比如可以使用 printStatistics 和 printFailureReport 获取它转储的信息的子集。

更多定制:跟踪测试时间

到目前为止,都是默认使用 TextTestRunner 运行测试。这种方式非常简便:实例化一个 TextTestRunner 类型的对象,在其中添加测试和输出器,然后调用 run 方法。现在,我们使用 TestRunner(TextTestRunner 的超类)和一种称为监听器 的类改变这种运行过程。假设希望跟踪各个测试花费的时间 — 执行性能基准测试的开发人员常常需要这样做。在进一步解释之前,先看一下 清单 20。这段代码使用三个类 TestRunner、TestResult 和 myListener(派生自 TestListener)。这里仍然使用 清单 10 中的 mystringTest 类。


清单 20. TestListener 类的使用
				
class myListener : public CppUnit::TestListener {
public:
  void startTest(CppUnit::Test* test) {
    std::cout << "starting to measure time\n";
  }
  void endTest(CppUnit::Test* test) {
    std::cout << "done with measuring time\n";
  }
};

int main ()
{
  CppUnit::TestSuite* suite = new CppUnit::TestSuite("mystringTest");
  suite->addTest(new CppUnit::TestCaller<mystringTest>("checkLength",
                &mystringTest::checkLength));
  suite->addTest(new CppUnit::TestCaller<mystringTest>("checkValue",
                &mystringTest::checkLength));

  CppUnit::TestRunner runner;
  runner.addTest(suite);

  myListener listener;
  CppUnit::TestResult result;
  result.addListener(&listener);

  runner.run(result);
  return 0;
}

清单 21 给出 清单 20 的输出。


清单 21. 清单 20 中代码的输出
				
	[arpan@tintin] ./a.out
starting to measure time
done with measuring time
starting to measure time
done with measuring time

myListener 类是 CppUnit::TestListener 的子类。需要覆盖 startTest 和 endTest 方法,这两个方法分别在每个测试之前和之后执行。可以通过扩展这些方法轻松地检查各个测试花费的时间。那么,为什么不在设置/清除例程中添加这种功能呢?可以这么做,但是这意味着在每个测试套件的设置/清除方法中会出现重复的代码。

接下来,看看运行器对象,它是 TestRunner 类的实例,它在 run 方法中接收一个 TestResult 类型的参数,并在 TestResult 对象中添加监听器。

最后,输出结果会发生什么变化?TextTestRunner 在运行 run 方法之后显示许多信息,但是 TestRunner 不显示这些信息。我们需要使用输出器对象显示监听器对象在执行测试期间收集的信息。清单 22 显示需要对 清单 20 做的修改。


清单 22. 添加输出器以显示测试执行信息
				
runner.run(result);
CppUnit::CompilerOutputter outputter( &listener, std::cerr );
outputter.write();

但是等一下:代码还无法编译。CompilerOutputter 的构造函数需要一个 TestResultCollector 类型的对象,而且因为 TestResultCollector 本身派生自 TestListener(关于 CppUnit 类层次结构的详细信息见 参考资料),所以需要从 TestResultCollector 派生 myListener。清单 23 给出可编译的代码。


清单 23. 从 TestResultCollector 派生监听器类
				
class myListener : public CppUnit::TestResultCollector {
…
};

int main ()
{
  …

  myListener listener;
  CppUnit::TestResult result;
  result.addListener(&listener);

  runner.run(result);

  CppUnit::CompilerOutputter outputter( &listener, std::cerr );
  outputter.write();

  return 0;
}

输出见 清单 24。


清单 24. 清单 23 中代码的输出
				
[arpan@tintin] ./a.out
starting to measure time
done with measuring time
starting to measure time
done with measuring time
str.cc:31:Assertion
Test name: checkLength
assertion failed
- Expression: s.size() == 0
- String Length Non-Zero

str.cc:31:Assertion
Test name: checkValue
assertion failed
- Expression: s.size() == 0
- String Length Non-Zero

Failures !!!
Run: 0   Failure total: 2   Failures: 2   Errors: 0

结束语

本文主要讨论了 CppUnit 框架的一些类:TestResult、TestListener、TestRunner、CompilerOutputter 等。CppUnit 是一个独立的单元测试框架,它还提供许多其他功能。CppUnit 中有用于生成 XML 输出的类(XMLOutputter)和用于以 GUI 模式运行测试的类(MFCTestRunner 和 QtTestRunner),还提供一个插件接口(CppUnitTestPlugIn)。一定要查阅 CppUnit 文档来了解它的类层次结构,通过示例了解详细的安装信息。


参考资料

学习

获得产品和技术

  • 下载 CppUnit:获取 CppUnit 的最新版本。

  • IBM 产品评估版:试用来自 DB2®、Lotus®、Rational®、Tivoli® 和 WebSphere® 的应用程序开发工具和中间件产品。

讨论

转载自IBM技术文章 http://www.ibm.com/developerworks/cn/aix/library/au-ctools2_cppunit/



cppunit原理分析以及例子 1、cppunit是什么 2、cppunit组成    在 CppUnit 中,一个或一组测试用例的测试对象被称为Fixture。Fixture 就是被测试的目标,可能是一个对象或者一组相关的对象,甚至一个函数。   有了被测试的Fixture,就可以对这个Fixture的某个功能、某个可能出错的流程编写测试代码,这样对某个方面完整的测试被称为TestCase。 阅读详情

相关推荐

C/C++/C++11软件测试实例

文中列举了使用PVS-Studio静态代码分析工具在C/C++/C++11中检测出来的错误。

CppUnit测试框架中的异常判断宏

TestAssert (名字空间中Assert函数集合) 说明: 在CppUnit的名字空间中的全局的判定(Assert)函数,提供了多样的判断方法。 预定义宏: (1)  CPPUNIT_ASSERT(condition) 测试目的:判断condition是否为true,如果是false则抛出异常 在进行单元测试的时候用到的最多的测试宏,判断条件condition是true还是f

追寻自己 1347

安卓端目标检测模型部署血泪史:从NCNN/TFLite/MNN全军覆没到Torchscipts终见光明

公司需在Android设备部署目标检测模型,要求: ✅ 实时检测速度≥15FPS ✅ 模型精度损失<5% ✅ 兼容中低端安卓设备👉 GitHub项目地址:pytorch/android-demo-app/ObjectDetection我已上传这份源码到csdn下载准备模型(必须走这步才能跑通安卓端源码)如果您没有设置PyTorch环境来运行该脚本,可以下载模型文件此处转到“android演示app/ObjectDetection/app/src/main/assets”文件夹,然后跳过此步骤的其余部分,直

机器学习、深度学习、强化学习、迁移学习 1567

CPPUnit 转载

<br />  问答|交流群|讲座|月刊|iProcess|uml.org.cn|网站地图      开放源码 C/C++ 单元测试工具,第 2 部分: 了解 CppUnit <br />2010-06-08 作者:Arpan Sen 来源:IBM 内容下载和安装 CppUnit使用 CppUnit 创建基本测试使用断言再次测试字符串类组织新测试使用 fixtures 定制测试创建不使用宏的测试套件运行多个测试套件定制输出的格式更多定制:跟踪测试时间结束语参考资料<br />本文是讨论开放源码单元测试工具的

hnhbdss的专栏 892

伯德图详解:从传递函数到系统稳定性的频域分析

在自动控制与控制系统设计中,理解系统对不同频率输入信号的响应特性,是分析和设计稳定系统的核心基础。频率响应描述了系统对正弦输入的幅值增益与相位变化规律,而伯德图作为最直观的频域分析工具,通过对数坐标将宽频带特性压缩成一条清晰曲线,让工程师无需复杂计算即可快速评估系统性能。从典型环节的渐近线绘制,到相位裕度、幅值裕度的读取,伯德图贯穿了系统稳定性判断、控制器参数整定及噪声抑制等关键场景。本文结合实际调试经验,系统讲解伯德图的绘制原理与读图方法,帮助读者快速掌握从传递函数到工程应用的核心技能。

weixin_34535286的博客 338

HIL(硬件在环)技术汇总梳理

HIL(Hardware-in-the-Loop)测试领域的知名公司有dSPACE、NI、Vector和speedgoat等,本文是针对这几家HIL技术的对比分析。

Mr.Cssust的博客 3687

C/C++编程-工程实践-单元测试工具总结

一定要找官网资源,按照官方资源的对应安装教程安装(本人费力很大劲头,从优快云,gitlab,或者通过“sudo apt-get isntall cpputest”等等下载资源,都有各种各样的问题,就是各种不匹配。资源和安装方法不匹配,或者教环境变量安装有问题等等)。当进行到 autoreconf …-i 报错:“can’t exec "libtoolize”. 这是没有装libtool工具。

张国芮 415

分布式光纤传感(DFOS)DTS/DAS/DSS 三合一:10公里管线监测实战与数据解读

本文详细介绍了分布式光纤传感(DFOS)技术在10公里管线监测中的实战应用,通过DTS(温度)、DAS(振动)、DSS(应变)三合一系统,实现对管线健康状态的立体感知。文章涵盖工程部署、数据采集、多物理量数据融合及噪声抑制等关键技术,展示了如何通过一根光纤完成复杂监测任务,显著提升管线安全性和维护效率。

weixin_29168153的博客 315

推荐开源项目:CTest —— 简约高效的C/C++单元测试框架

推荐开源项目:CTest —— 简约高效的C/C++单元测试框架 项目介绍 CTest是一款专为C/C++软件开发设计的轻量级单元测试框架。它以其简洁易用性、全面的功能和对Linux与OS/X系统的良好支持而脱颖而出,旨在简化单元测试的编写和执行过程,从而加速软件的质量保证流程。 项目技术分析 CTest的设计极其精巧,整体架构仅需一个头文件来集成到你的项目中,其源码少于300行,这不仅减少了学习...

gitblog_00257的博客 1024

keil自动分配SDRAM空间设置使用

1.修改.sct文件。

qizhi321123的博客 1404

Workbench中基于nCode的列车转向架随机振动疲劳寿命预测方法

本文详细介绍了在ANSYS Workbench中结合nCode进行列车转向架随机振动疲劳寿命预测的完整方法。通过几何清理、模态分析、PSD载荷定义及随机振动求解,并重点阐述了nCode中Dirlik等疲劳算法的选择与应用,为轨道交通关键部件的可靠性设计提供了系统的仿真分析流程与工程实践指导。

weixin_29234423的博客 473

linux unittest cpp,Linux下cppunit的基本使用说明文档及项目测试简介

Cppunit使用说明文档注:此文档部分内容来源于cppunit源码解读,以及https://www.ibm.com/developerworks/cn/linux/l-cppunit/index.html与http://blog.youkuaiyun.com/freefalcon/article/details/753819参照该文档可以更好的理解cppunit的使用,无耻的加了原创一、CppUnit核心内...

weixin_31446915的博客 356

【maven】idea左侧External Libraries里,没有Maven的依赖包 代码飘红

文章目录1.概述M.参考 1.概述 因为内网开发,然后这几天我被隔离了,然后公司搞了一个外网的vpn能连接的云桌面,云桌面也是网络隔离的,因此只能自己拷贝相关的文件到里面。 然后我就拷贝了代码和maven仓库中的一部分,因为本地的20G一次拷贝不完,需要多次拷贝,但是我拷贝了kafka,仍然飘红。具体如下 idea左侧External Libraries里,没有Maven的依赖包 然后整了很久都没搞定,后来我自己新建了一个项目,然后引入发现是不可以的,而且框框里面的飘红。 然后我就想是不是因为缺少依赖

九师兄 4411

Windows环境下用Eclipse+MinGW编译CppUnit的错误解决

在我们编译CppUnit时有可能遇到下面的错误 #error Cannot define CppUnit::OStringStream 在你的project的Properties->C/C++ Build/Setting/GCC C++ Compiler/Preporcessor加入预定义宏CPPUNIT_HAVE_SSTREAM 然后在编译,就可以编译通过生成静态或者动态C

blh的专栏 1328

dht11在oled上显示温度 stm32l432kc,如何实现?

🏆 本文收录于《全栈Bug调优(实战版)》专栏,致力于分享我在项目实战过程中遇到的各类Bug及其原因,并提供切实有效的解决方案。无论你是初学者还是经验丰富的开发者,本文将为你指引出一条更高效的Bug修复之路,助你早日登顶,迈向财富自由的梦想🚀!同时,欢迎大家关注、收藏、订阅本专栏,更多精彩内容正在持续更新中。让我们一起进步,Up!Up!Up!    备注: 部分问题/难题源自互联网,经过精心筛选和整理,结合数位十多年大厂实战经验资深大佬经验总结所得,数条可行方案供所需之人参考。

**My Coding Family** 1201

TMS_WebGMaps_1.9.8.0_Full_Source

TMS_WebGMaps_1.9.8.0_Full_Source 全源码 delphi cbuilder

配置cppunit的方法

编译1.       编译$BASE/src/cppunit/CppUnitLibraries.dsw中的cppunit_dll项目,release版生成cppunit_dll.lib和cppunit_dll.dll,debug版生成cppunitd_dll.lib和cppunitd_dll.dll。这是CPPUnit基本类库。2.       编译$BASE/src/cppunit/CppUni

老裴 1020

ET2012新版免狗免安装绿色软件

ET2012新版免狗免安祖昂绿色软件。,新界面,新视觉,

使用CppUnit编写测试程序

******************************************************************************* 使用CppUnit编写测试程序的大致流程* 20050823 by daineng@nj.cpsecure*******************************************************************

daineng的专栏 1544

Camera2Demo

在Camera2 的基础上进行封装,使得Camera2一堆初始化逻辑与Activity分离,降低耦合度,完成预览拍照并保存的操作

老版QQ原生表情gif动态

这是老版的QQ表情,不过全是动态的的,Windows照片查看器是不会动的,可以右击用浏览器打开查看,再说一遍是老版的,只是分享给宁愿用老版也要动态的人。

cppunit

cppunit主要结构主要是Test和TestResult的交互,Test是一个接口,可能不只 一个测试,他里面可能包含好多的测试,TestResult是用 来得到测试结果的接口。TestResult是用来收Test的信息的, 把结果delege到TestListener。 TestCase是有TestFixture的Test。用户的

ufwt的专栏 1013

CPPUNIT安装和使用(linux)

库安装 下载cppunit-1.12.0.tar.gz 标准的解压加安装:   $ tar xzvf cppunit-1.12.0.tar.gz    $ cd cppunit-1.12.0   $ ./configure   $ make   $ make install 配置共享库   $ vi /etc/ld.so.conf     //在文件中添加 /usr/loca

小庞(android/java/PHP/Web/linux/mysql) 2193

配置和使用CPPUnit笔记

一、      配置cppunit的方法编译1.       编译$BASE/src/cppunit/CppUnitLibraries.dsw中的cppunit_dll项目,release版生成cppunit_dll.lib和cppunit_dll.dll,debug版生成cppunitd_dll.lib和cppunitd_dll.dll。这是CPPUnit基本类库。2.       编译$BAS

清晖 2770

CppUnit 入门

CppUnit 是一个基于 LGPL 的开源项目,最初版本移植自 JUnit,是一个非常优秀的开源测试框架。CppUnit 和 JUnit 一样主要思想来源于极限编程(XProgramming)。主要功能就是对单元测试进行管理,并可进行自动化测试。本文主要介绍如何利用 CppUnit 进行单元测试。

Cynhard的专栏 5729

CppUnit代码理解(1)

目前网上搜索到的讲CppUnit源码解读基本来源于晨光CppUnit源码解读,是很好的源码阅读笔记。但是针对的是 CppUnit1.8.0版,现在网上下载到的一般都比这个新了,我下载的是1.12.1版,代码有一些变动,就结合晨光的 笔记仔细看了一些源码。 首先看一下我们通常写的简单的测试类:   class MyTest : public CppUnit::TestFixture { C...

渴死的火烈鸟 210

VS2005配置CPPUnit进行单元测试

前言:本文配置环境Windows XP + VS2005。CPPUnit版本为1.12.1。      下载地址:http://sourceforge.net/projects/cppunit/files/一、         编译CPPUnit工程1、  解压文件cppunit-1.12.1.tar.gz。2、  编译$BASE/src/cppunit/CppUnitLibrar

沙漠黑鸟的专栏 2695

CPPUnit使用方法初探

一、      配置cppunit的方法编译1.       编译$BASE/src/cppunit/CppUnitLibraries.dsw中的cppunit_dll项目,release版生成cppunit_dll.lib和cppunit_dll.dll,debug版生成cppunitd_dll.lib和cppunitd_dll.dll。这是CPPUnit基本类库。2.   

我的程序世界 1781

Source Insight宏 - CppUnit单元测试框架自动生成

一个好的开发工具能够极大的提高工作效率,而好的开发工具是智慧与努力的结晶。 这里包括2个宏:CppUnitTest_CreateSuite和CppUnitTest_CreateMain CppUnitTest_CreateMain用来产生单元测试主框架,产生的文件为alltest.cpp,如下: #include #include int main(int argc, char**

巴山独钓 2489

CppUnit 单元测试框架(二)

二、编写单元测试代码 在 CppUnit 中,每一个测试用例用一个类表示,该类通常用于测试一个模块,如果该模块是一个类,正好对应这个测试用例。 定义类: 每个测试用例类都必有继承自 CPPUNIT_NS::TestFixture。如: class SampleTestCase : public CPPUNIT_NS::TestFixture 并且,这个类还需要定义

HHF 的博客 1826
上一篇: linux下判断路径是否存在的3种方法
下一篇: 循环使用strrchr要注意的问题
RunBoying
博客等级 码龄17年 41粉丝 117原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值