我是一个相当新的软件开发人员,目前正在为几年前开始的现有C++项目添加单元测试.由于非技术原因,我不允许修改任何现有代码.我所有模块的基类都有一堆设置/获取数据和与其他模块通信的方法.
由于我只想对每个单独的模块进行单元测试,因此我希望能够为所有模块间通信方法使用预设值.即一个方法Ping(),它检查另一个模块是否处于活动状态,我希望根据我正在进行的测试类型返回true或false.我一直在研究Google Test和Google Mock,它确实支持模拟非虚拟方法.但是,所描述的方法(http://code.google.com/p/googlemock/wiki/CookBook#Mocking_Nonvirtual_Methods)要求我"模板化"原始方法以接受真实或模拟对象.由于前面提到的要求,我无法去基类中模拟我的方法,所以我需要一些其他方法来模拟这些虚方法
基本上,我想要模拟的方法是在一些基类中,我想要单元测试的模块和创建模块的是该基类的派生类.我的基本Module类和我想测试的模块之间有中间模块.
我很感激任何建议!
谢谢,
JW
编辑:一个更具体的例子
我的基类是rootModule,我要测试的模块是leafModule.有一个继承自rootModule的中间模块,leafModule继承自这个中间模块.
在我的leafModule中,我想测试doStuff()方法,该方法调用rootModule类中定义的非虚拟GetStatus(moduleName).我需要以某种方式使GetStatus()返回一个选定的固定值.模拟对我来说是新的,所以使用模拟对象甚至是正确的方法?
我正在阅读SICP的以下部分
http://mitpress.mit.edu/sicp/full-text/book/book-ZH-26.html#%_sec_4.1.7
根据文本,以下eval改进将提高性能,因为多次评估的表达式只会被分析一次?
(define (eval exp env)
((analyze exp) env))
Run Code Online (Sandbox Code Playgroud)
这是analyze本书中给出的函数:
(define (analyze-if exp)
(let ((pproc (analyze (if-predicate exp)))
(cproc (analyze (if-consequent exp)))
(aproc (analyze (if-alternative exp))))
(lambda (env)
(if (true? (pproc env))
(cproc env)
(aproc env)))))
Run Code Online (Sandbox Code Playgroud)
我不明白为什么这本书说analyze只会运行一次.没有了身体eval,这是((analyze exp) env))基本上是说,每次eval被调用时,analyze将一个名为exp作为它的参数?这意味着analyze每次调用时eval都会调用它.
我的理解有什么问题?我将不胜感激任何反馈,谢谢!
我使用的库为外部程序提供python接口.这允许我创建:
foo = Foo()
Run Code Online (Sandbox Code Playgroud)
上面的代码启动了我可以在python中控制的Foo程序的新实例.
我有一个python脚本,需要多次调用,并根据外部参数,告诉外部Foo程序的单个实例做不同的事情.显然我做不到
foo = Foo() 每次,
因为每次我的脚本运行时都会创建一个新的Foo实例.
我想要做的是创建foo= Foo()一次,并让多个调用共享同一个实例.目前我只想创建一次,序列化它,并让我的脚本反序列化它.这种方法有效吗?还有更好的选择吗?
谢谢!!
使用Google无法找到任何有用的信息.
我发现的所有人都在询问如何解决编译错误,例如
make: *** No rule to make target `/home/joe/[ubuntuTouch]/out/target/product/jewel/obj/SHARED_LIBRARIES/libril_intermediates/export_includes', needed by `/home/joe/[ubuntuTouch]/out/target/product/jewel/obj/EXECUTABLES/rild_intermediates/import_includes'. Stop.
Run Code Online (Sandbox Code Playgroud) 我正在尝试使用CPPUnit为大型代码库创建一个单元测试框架.我需要能够测试单个模块,所有模块都是以特定根模块开头的模块树的一部分.
由于非技术原因,我无法触摸生产文件(我的原始方法涉及向根模块添加ifdef).所以我想到了另一种方法,即创建根模块头的副本以及属于中间继承层次结构中的模块的头的副本.由于涉及的模块数量以及每个模块源的大小.我正在寻找一种方法来自动为我合并.
所以对于foo.h和foo.cpp,我正在寻找一种输出fooTest.h的工具,其中fooTest.h包含foo.cpp/foo中所有内容的声明和定义. H
编辑:谢谢你的答案,我忘了提到的一件事是,fooTest.h的内容不应该是foo.cpp和foo.h的合并结果.我需要对根fooTest.h进行微小的更改,以使其成为一个合适的模拟模块进行测试.因此,简单地使用包含将不起作用.我将研究连接文件,看看是否能解决我的问题.
c++ ×2
unit-testing ×2
android ×1
googlemock ×1
lisp ×1
makefile ×1
mocking ×1
python ×1
scheme ×1
sicp ×1