我是CMake的新手,我正在使用Google Test Framework.我已经找到了将CMake和Google测试框架结合起来的更复杂的例子,但我没有太多运气.我希望有人可以就我到达的设置提出他们的意见并为我回答一个问题.这是基本的项目结构:
ProjectFolder
-CMakeLists.txt
/ build
/ include- all
我的.h文件
/ src
-CMakeLists.txt-
所有我的.cpp文件
/测试
-CMakeLists.txt
/ gtest
-Google的CMakeLists.txt
/ mocks
-CMakeLists.txt
-cpp和h模拟文件
简而言之,根cmake文件将src和tests作为子目录添加.src cmake文件将cpp文件复制到库中.测试cmake文件添加了mocks和gtest作为子目录.模拟cmake文件将其所有cpp文件复制到第二个库中.最后,tests文件夹中的cmake文件将src库,google库和mocks库与单元测试可执行文件链接起来.
我最终得到的是几个可执行文件:objA_unittest,objB_unittest等
一些东西:
要构建所有这些并仍然保持我的项目目录相当干净我进入构建文件夹并运行"cmake .."这似乎工作得很好,我计划配置vim以始终运行make这个文件夹.有没有人有这方法的任何提示或看到任何问题?
我不喜欢在我的项目文件夹中嵌入谷歌库的想法(特别是如果我最终有几个项目使用它),但是因为它似乎强烈建议您不要预编译谷歌库我可以看到没办法解决这个问题.但是,如果有人知道更好的方式,我很乐意听到它.
运行测试.我喜欢我所要做的就是运行"make test"来用ctest执行我的所有单元测试.但是,我发现我不太喜欢输出.每个单元测试可执行文件包含几个不同的单 直接运行这些提供了Google非常详细的反馈.如果可执行文件中的某个测试失败,我确切知道测试失败的原因和原因.以前,我使用了makefile,在makefile的末尾我只执行了所有的测试.我首先尝试通过在cmake中创建自定义构建目标来解决此问题.但是,它只执行第一个命令.我要么需要一种方法来从CTest获得更详细的输出,或者我需要一种方法来自动输出bash脚本或类似于CMake的东西来执行每个单元测试可执行文件.换句话说,我现在已经设置了cmake文件,所以我只需要在一个地方添加单元测试来生成可执行文件,我不想记得将它添加到第二个位置,如果我能避免的话它.有没有人有这方面的经验?
首先十分感谢.
我正在玩一个小游戏项目,因为我在TDD方面不是很有经验,所以我很乐意在一些事情上获得一些专家意见.
首先,我很早就意识到TDD似乎不适合游戏开发.看来这个问题的观点差异很大.我最初没有受过教育的意见是TDD似乎对所有游戏逻辑都有效.我认为,任何处理视频输出和声音的内容都会被抽象为可视化测试的类.
事情开始很顺利.目标是创建一个2d太空飞行游戏(小行星为那些关心的人).我为Ship类创建了一系列单元测试.像初始化,旋转这样的东西可以很容易地在一系列中测试,例如:GetRotation(),TurnRotateRightOn(),Update(1),GetRotation(),Expect_NE(rotation1,rotation2).然后我遇到了第一个问题.
我对TDD的理解是你应该写测试你认为应该如何使用这个类.我希望船能够移动,所以我写了一个基本上说的课程.GetCoordinates(),ThrustOn(),Update(1),GetCoordinates().那可以确保船在某处移动.然而,我很快意识到我必须确保船舶以正确的方向和正确的速度移动.接下来是一个75线单元测试,我基本上必须初始化旋转,检查坐标,初始化推力,更新船,获得新坐标,检查新的旋转.更重要的是,我认为没有必要在游戏中获得船的速度(只是坐标,船应该更新自己).因此,我无法直接获得速度.所以测试基本上必须重新计算速度应该是什么,所以我可以确保它与更新后得到的坐标相匹配.总而言之,这非常混乱,非常耗时,但却很有效.测试失败,测试通过等.
直到后来当我意识到我想将船的更新代码重构为抽象的"Actor"类时才这样.我意识到虽然Actor的每个子类都需要能够正确计算一个新位置,但并不是每个子类都必须以相同的方式更新它们的速度(一些碰撞,一些不碰撞,一些碰撞静态速度).现在,我基本上面临着重复和改变庞大而庞大的测试代码的前景,我不禁认为应该有更好的方法.
有没有人有任何经验来处理单元测试这种复杂的黑盒子类型的工作?看起来我基本上不得不在测试中编写完全相同的物理代码,所以我知道结果应该是什么.这真的是自我失败,而且我确信我一路上都错过了这一切.我非常感谢任何人提供的任何帮助或建议.
我看到有几个问题基于这个主题,但我有一些具体的例子,我正在努力.我希望有人可以在这里帮助我,因为我是新手测试驱动开发和单元测试.
(我不确定它是否重要,但我使用的是C#与.NET framework 4.0并使用Microsoft的内置测试框架)
首先,是否值得测试非常简单的代码块?例如,对于我的一个类,我有一个Fill方法,它接受10个参数,并根据这些参数设置类中10个属性的值.填充代码实际上只是一系列值设置语句.我已经读过一个好的单元测试应该只断言一件事,但在我看来,为了检查所有这些值是否已正确设置,我必须断言10件事.所以要么我根本不能测试它,相信代码很简单,或者写10个不同的单元测试来检查每个属性.这些都是正确的吗?
第二个例子.我有一个代码块,可以调用一个类的私有方法,最后调用一个Web服务来向用户发送一封电子邮件.我知道我应该为电子邮件服务注入一个模拟Web服务,这样我就不会测试多个类,但是我应该如何测试所有这些私有方法和那个电子邮件调用?
第三个例子与上一个例子类似.我的班级结构看起来像:
控制器---取决于---> IWidget(某些业务对象)&& IDataProvider DataProvider(Implements IDataProvider)---取决于---> WebService WebService ---直接调用--->数据库
现在我有控制器的单元测试(注入模拟Widgets和DataProviders).这一切都很好.我也有Widget的单元测试没有问题.
问题归结于DataProvider和WebService.此特定实例中的WebService除了通过数据提供者的请求并传回数据(由于物理体系结构限制)之外什么都不做.
我无法对DataProvider进行单元测试,因为我不确定如何注入模拟Web服务.我也不确定单元测试DataProvider是否值得,因为我最终只需要编写很多模拟数据集来测试值.同样,我不确定如何对Web服务进行单元测试,因为在这种情况下,WebService的主要功能取决于数据库.再一次,这值得测试吗?如果WebService做了更多,除了仅作为传递但仍依赖于数据库,该怎么办?
我非常感谢任何人在这方面可以提出的任何建议.非常感谢.