如何设置外部项目以下载不是 .tgz 文件的链接?
例如,Catch提供了一个单头分发版本。我只想下载这个而不是 git repo 或 .tgz 版本。但我还没有想出如何告诉 CMake 这样做。
我想做类似的事情:
Include(ExternalProject)
ExternalProject_Add(
catch
PREFIX ${CMAKE_BINARY_DIR}/catch
URL https://github.com/philsquared/Catch/releases/download/v1.9.6/catch.hpp ${CMAKE_BINARY_DIR}/catch
CONFIGURE_COMMAND ""
BUILD_COMMAND ""
INSTALL_COMMAND ""
LOG_DOWNLOAD ON
)
Run Code Online (Sandbox Code Playgroud)
这将失败,因为 URL 假定 url 是压缩的 tar 文件。我尝试了DOWNLOAD_COMMAND 的各种变体,但都没有成功。
我已经启动了一个简单的 C++ 项目,该项目使用 Bazel 作为构建系统,并希望将 Catch2 添加到其中作为测试框架。
这是我的项目到目前为止的样子:
WORKSPACE -> empty file
src/
Money.hpp
Money.cpp
BUILD
Run Code Online (Sandbox Code Playgroud)
其中 BUILD 只是
WORKSPACE -> empty file
src/
Money.hpp
Money.cpp
BUILD
Run Code Online (Sandbox Code Playgroud)
我希望能够为每个创建测试cc_library
,在本例中为Money
. 我尝试设置它,但与 Catch2 main 感到困惑。任何有关如何做到最好的建议都将受到赞赏!
到目前为止我一直在使用Boost.Test,但我现在正在考虑使用带有Catch的BDD,但是我在查找处理异常的好方法时遇到了一些麻烦.说我有这样的测试:
SCENARIO("connection handling", "[network]") {
boost::asio::io_service io;
GIVEN("a connection that should fail") {
connection::ptr conn = connection::create(new fake_provider<connection_refused>(io));
WHEN("trying to connect") {
conn->connect("localhost", 1);
THEN("connection was refused") {
some stuff to verify exception code
REQUIRE(conn->connected() == false);
}
}
}
}
Run Code Online (Sandbox Code Playgroud)
现在我想知道如何处理connect()将以一种很好的方式抛出异常的事实.我想我可以保存并将异常存储在try-catch中并在那之下验证,但这似乎不太好.在我的Boost.Test测试用例中,我这样做了:
bool error_is_connection_refused(boost::system::system_error ex) {
return ex.code() == boost::system::errc::connection_refused;
}
BOOST_AUTO_TEST_CASE(connect)
{
connection::ptr conn_refuse = connection::create(new fake_provider<connection_refused>(*io_ptr));
BOOST_REQUIRE_EXCEPTION(conn_refuse->connect("localhost", 1),
boost::system::system_error,
error_is_connection_refused);
BOOST_REQUIRE_EQUAL(conn_refuse->connected(), false);
}
Run Code Online (Sandbox Code Playgroud)
但这似乎不是很BDD.在使用BDD测试时,人们通常如何处理异常抛出代码?
我想使用Catch对 C++ 库进行单元测试。但是,我需要按顺序运行大部分测试用例。即库需要以某种方式初始化,然后用户登录等。是否有任何设计模式可以实现这一点。
预先感谢。
我开始使用"Catch"单元测试框架,到目前为止它真的很棒.我使用VS内置单元测试框架,非常痛苦.
有一件事我注意到宏REQUIRE_THROWS_AS
不像人们期望的那样表现
来自文档:
Run Code Online (Sandbox Code Playgroud)REQUIRE_THROWS_AS( expression, exception type ) and CHECK_THROWS_AS( expression, exception type )
期望在评估表达式期间抛出指定类型的异常.
当我试着写
TEST_CASE("some test") {
SECTION("vector throws") {
std::vector<int> vec;
REQUIRE_THROWS_AS(vec.at(10), std::logic_error);
}
}
Run Code Online (Sandbox Code Playgroud)
我希望测试失败,但它说测试通过了.框架中有错误还是我错了?
我正在尝试将Catch
单元测试集成到我的项目中,但是对于当前可用的测试来说它失败了
Catch v1.10.0
Generated: 2017-08-26 15:16:46.676990
Run Code Online (Sandbox Code Playgroud)
例:
test.cpp
#include "catch.hpp"
#define CATCH_CONFIG_MAIN
TEST_CASE("CATCH TEST"){
REQUIRE(1 == 1);
}
Run Code Online (Sandbox Code Playgroud)
g++ test.cpp -o test.exe -std=c++11
Run Code Online (Sandbox Code Playgroud)
错误:
Undefined symbols for architecture x86_64:
"Catch::ResultBuilder::endExpression(Catch::DecomposedExpression const&)", referenced from:
Catch::BinaryExpression<int const&, (Catch::Internal::Operator)0, int const&>::endExpression() const in test-b77427.o
"Catch::ResultBuilder::setResultType(bool)", referenced from:
Catch::BinaryExpression<int const&, (Catch::Internal::Operator)0, int const&>::endExpression() const in test-b77427.o
"Catch::ResultBuilder::useActiveException(Catch::ResultDisposition::Flags)", referenced from:
____C_A_T_C_H____T_E_S_T____0() in test-b77427.o
"Catch::ResultBuilder::react()", referenced from:
____C_A_T_C_H____T_E_S_T____0() in test-b77427.o
"Catch::ResultBuilder::ResultBuilder(char const*, Catch::SourceLineInfo const&, char const*, Catch::ResultDisposition::Flags, char const*)", referenced from:
____C_A_T_C_H____T_E_S_T____0() in test-b77427.o …
Run Code Online (Sandbox Code Playgroud) 我编写了以下Makefile(它按预期工作):
CXX2 = clang++
CXXFLAG2 = -std=c++11 -c -g -O0 -Wall -Wextra
LD2 = clang++
LDFLAG2 = -std=c++11
testing: data_test.o test_main.o dataframe.o csvreader.o course.o
$(LD2) $^ $(LDFLAG2) -o $@
data_test.o: test/data_test.cpp
$(CXX2) $< $(CXXFLAG2)
test_main.o: test/test_main.cpp
$(CXX2) $< $(CXXFLAG2)
dataframe.o: src/DataFrame.cpp src/CSVReader.cpp src/Course.cpp
$(CXX2) $< $(CXXFLAG2)
Run Code Online (Sandbox Code Playgroud)
在我的test_main.cpp
文件中,我只有以下几行:
#define CATCH_CONFIG_MAIN
#include "catch.hpp"
Run Code Online (Sandbox Code Playgroud)
我试着看看我的Makefile中是否可以替换测试规则,如下所示:
data_test.o: test/data_test.cpp test/test_main.cpp
$(CXX2) $< $(CXXFLAG2)
Run Code Online (Sandbox Code Playgroud)
但是,我收到一个"_main", referenced from:
implicit entry/start for main executable
错误.对我来说,它似乎应该工作正常,包括test_main.cpp
作为我的实际测试的依赖.是否有理由将此主文件编译为自己的.o
文件?
所有
用迭代器写了一些花哨的容器.所以我有
iterator begin() {
}
iterator end() {
}
const_iterator begin() const {
}
const_iterator end() const {
}
Run Code Online (Sandbox Code Playgroud)
在测试中,我实例化容器,填充并测试它.调用const和非const版本的接受/好方法是什么?说,简单的测试就好
TEST( c.end() - c.begin() == c.size() );
Run Code Online (Sandbox Code Playgroud)
应该运行迭代器和const迭代器.Const参考?有些丑陋的演员?