Skip to content
GitLab
Menu
Projects
Groups
Snippets
Loading...
Help
Help
Support
Community forum
Keyboard shortcuts
?
Submit feedback
Contribute to GitLab
Sign in / Register
Toggle navigation
Menu
Open sidebar
yangql
googletest
Commits
f71fb4f9
Unverified
Commit
f71fb4f9
authored
May 17, 2019
by
Gennadiy Civil
Committed by
GitHub
May 17, 2019
Browse files
Update advanced.md
Adding back section that was lost in merge
parent
03273a89
Changes
1
Show whitespace changes
Inline
Side-by-side
Showing
1 changed file
with
61 additions
and
0 deletions
+61
-0
googletest/docs/advanced.md
googletest/docs/advanced.md
+61
-0
No files found.
googletest/docs/advanced.md
View file @
f71fb4f9
...
...
@@ -1817,6 +1817,67 @@ For technical reasons, there are some caveats:
1.
`statement`
in
`EXPECT_FATAL_FAILURE{_ON_ALL_THREADS}()()`
cannot return a
value.
## Registering tests programmatically
The
`TEST`
macros handle the vast majority of all use cases, but there are few
were runtime registration logic is required. For those cases, the framework
provides the
`::testing::RegisterTest`
that allows callers to register arbitrary
tests dynamically.
This is an advanced API only to be used when the
`TEST`
macros are insufficient.
The macros should be preferred when possible, as they avoid most of the
complexity of calling this function.
It provides the following signature:
```
c++
template
<
typename
Factory
>
TestInfo
*
RegisterTest
(
const
char
*
test_case_name
,
const
char
*
test_name
,
const
char
*
type_param
,
const
char
*
value_param
,
const
char
*
file
,
int
line
,
Factory
factory
);
```
The
`
factory
`
argument
is
a
factory
callable
(
move
-
constructible
)
object
or
function
pointer
that
creates
a
new
instance
of
the
Test
object
.
It
handles
ownership
to
the
caller
.
The
signature
of
the
callable
is
`
Fixture
*
()
`
,
where
`
Fixture
`
is
the
test
fixture
class
for
the
test
.
All
tests
registered
with
the
same
`
test_case_name
`
must
return
the
same
fixture
type
.
This
is
checked
at
runtime
.
The
framework
will
infer
the
fixture
class
from
the
factory
and
will
call
the
`
SetUpTestCase
`
and
`
TearDownTestCase
`
for
it
.
Must
be
called
before
`
RUN_ALL_TESTS
()
`
is
invoked
,
otherwise
behavior
is
undefined
.
Use
case
example
:
```
c++
class MyFixture : public ::testing::Test {
public:
// All of these optional, just like in regular macro usage.
static void SetUpTestCase() { ... }
static void TearDownTestCase() { ... }
void SetUp() override { ... }
void TearDown() override { ... }
};
class MyTest : public MyFixture {
public:
explicit MyTest(int data) : data_(data) {}
void TestBody() override { ... }
private:
int data_;
};
void RegisterMyTests(const std::vector
<int>
& values) {
for (int v : values) {
::testing::RegisterTest(
"MyFixture", ("Test" + std::to_string(v)).c_str(), nullptr,
std::to_string(v).c_str(),
__FILE__, __LINE__,
// Important to use the fixture type as the return type here.
[
=
](
)
-> MyFixture
*
{ return new MyTest(v); });
}
}
...
int main(int argc, char
**
argv) {
std::vector
<int>
values_to_test = LoadValuesFromConfig();
RegisterMyTests(values_to_test);
...
return RUN_ALL_TESTS();
}
```
## Getting the Current Test's Name
...
...
Write
Preview
Markdown
is supported
0%
Try again
or
attach a new file
.
Attach a file
Cancel
You are about to add
0
people
to the discussion. Proceed with caution.
Finish editing this message first!
Cancel
Please
register
or
sign in
to comment