mirror of
https://github.com/catchorg/Catch2.git
synced 2024-11-30 09:13:29 +01:00
3087e19cc7
This greatly simplifies running Catch2 tests in single binary in parallel from external test runners. Instead of having to shard the tests by tags/test names, an external test runner can now just ask for test shard 2 (out of X), and execute that in single process, without having to know what tests are actually in the shard. Note that sharding also applies to test listing, and happens after tests were ordered according to the `--order` feature.
41 lines
1.3 KiB
C++
41 lines
1.3 KiB
C++
/*
|
|
* Distributed under the Boost Software License, Version 1.0. (See accompanying
|
|
* file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt)
|
|
*/
|
|
#include <catch2/catch_test_macros.hpp>
|
|
#include <catch2/generators/catch_generators_all.hpp>
|
|
|
|
#include <catch2/internal/catch_sharding.hpp>
|
|
|
|
#include <unordered_map>
|
|
#include <vector>
|
|
|
|
TEST_CASE("Sharding Function", "[approvals]") {
|
|
std::vector<int> testContainer = { 0, 1, 2, 3, 4, 5, 6 };
|
|
std::unordered_map<int, std::vector<std::size_t>> expectedShardSizes = {
|
|
{1, {7}},
|
|
{2, {4, 3}},
|
|
{3, {3, 2, 2}},
|
|
{4, {2, 2, 2, 1}},
|
|
{5, {2, 2, 1, 1, 1}},
|
|
{6, {2, 1, 1, 1, 1, 1}},
|
|
{7, {1, 1, 1, 1, 1, 1, 1}},
|
|
};
|
|
|
|
auto shardCount = GENERATE(range(1, 7));
|
|
auto shardIndex = GENERATE_COPY(filter([=](int i) { return i < shardCount; }, range(0, 6)));
|
|
|
|
std::vector<int> result = Catch::createShard(testContainer, shardCount, shardIndex);
|
|
|
|
auto& sizes = expectedShardSizes[shardCount];
|
|
REQUIRE(result.size() == sizes[shardIndex]);
|
|
|
|
std::size_t startIndex = 0;
|
|
for(int i = 0; i < shardIndex; i++) {
|
|
startIndex += sizes[i];
|
|
}
|
|
|
|
for(std::size_t i = 0; i < sizes[shardIndex]; i++) {
|
|
CHECK(result[i] == testContainer[i + startIndex]);
|
|
}
|
|
} |