The steps and links were valid as of January 2013, but the internet is not a fixed environmnt ;-) For the most up to date information, consult the tool's own home pages.
1. Download and install the 64-bit version of Java from http://java.com/en/download/manual.jsp
(If you will be using a 32-bit version of Eclipse, you should be able to get away with 32-bit Java)
2. Download and install 'Eclipse for C/C++ Developers' from http://www.eclipse.org
(This tutorial is based on the 64-bit Juno version, but 32-bit should also work fine)
3. Download and run the latest MinGW installer from
http://sourceforge.net/projects/mingw/files/Installer/mingw-get-inst/
When asked by the installer, check "MSYS Basic System" and the C++ compiler (Optionally uncheck the C compiler).
IMPORTANT: Yes, you need MSYS, because it contains rm, which is used by mingw32-make when cleaning builds.
IMPORTANT: You must manually add MSYS and GCC to your Windows PATH, the MinGW installer intentionally does not do this for you !! (Since I installed MinGW into C:\Apps\MinGw, I added C:\Apps\MinGw\bin\ and C:\Apps\MinGw\1.0\bin to my PATH)
4. Download GoogleTest from https://code.google.com/p/googletest/downloads/list
and extract the zip file contents into a local directory.
Rename the directory to C:\Apps\googletest, so e.g. the file README ends up in that directory.
To build the googletest library I did as the googletest README says:
A. Open a DOS window
B. cd C:\Apps\googletest\make
C. mingw32-make
(This compiles the library)
D. ar -rv libgtest.a gtest-all.o
(This create the library libgtest.a out of the file gtest-all.o)
At this point, all the tools are installed.
The remaining steps will all be carried out in Eclipse, so start up Eclipse.
5. In Eclipse, create a brand new project for our C++ code:
Click File | New | C++ Project
Project name: my_fist_tdd_project
Project type : Executable, Hello World C++ Project
Toolchains : MinGw
The project Eclipse creates is empty, except for 6 include patchs for MinGw.
6. Change the project's builder to MinGw's builder:
Click Project | Properties | C++ Build | Tool Chain Editor
Select 'GNU Make Builder' in the 'Current builder' pull-down list.
Click Apply
7. Change the project's build command:
Click Project | Properties | C++ Build
Select '[All configurations]' in the 'Configuration' pull-down list.
Uncheck 'Use default build command'
Enter 'mingw32-make' in 'Build Command'.
Click Apply
8. You should now be able to test your build settings:
Click Project | Build project
The message "Info: Nothing to build for
9. Add the path of googletest's header files to the project's include paths:
Click Project | Properties | C++ Build
Make sure the selected build configuration is Debug (It is by default)
Click Settings | Tool Settings | GCC C++ Compiler | Includes
For the 'Include paths (-I)' list, click the green plus sign, then
the File system.. button.Browse to googletest's 'include' directory, and select it. (C:\Apps\googletest\include)
The absolute path now appears in the list box.
Click Apply
10. Add the path of the googletest library to the project's linker paths:
Click Project | Properties | C++ Build
Make sure the selected build configuration is Debug (It is by default)
Click Settings | Tool Settings | MinGW C++ Linker | Libraries
For the 'Libraries (-l)' list, click the green plus sign.
Enter 'gtest' in the pop-up window. (Note: not 'libgtest.a')
This library name now appears in the list box.
For the 'Library search path (-L)' list, click the green plus sign,
Browse to libgtest.a's directory, and select the dir. (C:\Apps\googletest\make)
The absolute path of the directory now appears in the list box.
Click Apply
11. Add a source folder:
Click File | New | Source folder
Folder name: src (Or whatever you prefer)
Now, in the final step, let's test our environment for completeness:
12. In the new src source folder, click File | New | Source file
Name it Counter.h and fill it with:
class Counter {
private:
int counter_;
public:
Counter() : counter_(0) {}
int Increment();
};
Add a second file Counter.cpp in the src folder, and fill it with:
#include <stdio.h>
#include "Counter.h"
int Counter::Increment() {
return counter_++;
}
Add a third file Counter_tests.cpp to the src folder, and fill it with:
#include <iostream>
using namespace std;
#include "gtest/gtest.h"
#include "Counter.h"
TEST(Counter, Increment) {
Counter c;
EXPECT_EQ(0, c.Increment());
EXPECT_EQ(1, c.Increment());
EXPECT_EQ(2, c.Increment());
cout << "Congratulations, you have just run a test :-)" << endl;
}
int main(int argc, char **argv) {
::testing::InitGoogleTest(&argc, argv);
return RUN_ALL_TESTS();
}
Click Project | Run
and expect to see the output from Counter_tests.cpp in Eclipse's Console window:
[==========] Running 1 test from 1 test case.
[----------] Global test environment set-up.
[----------] 1 test from Counter
[ RUN ] Counter.Increment
Congratulations, you have just run a test :-)
[ OK ] Counter.Increment (0 ms)
[----------] 1 test from Counter (0 ms total)
[----------] Global test environment tear-down
[==========] 1 test from 1 test case ran. (0 ms total)
[ PASSED ] 1 test.
The set-up is complete, you can now start coding awsome C++ applications, and unit test them with GoogleTest, in Eclipse. Happy coding!
-------------------------------------------------
Hint: You will get the error message
undefined reference to `WinMain@16'
from Eclipse if you forget the main() function in Counter_tests.cpp. Just copy the above Counter_tests.cpp and you should be fine.
Thanks a LOT! I've spent some time trying to get it right, and it wasn't easy... Your post is the best: and I know what I'm typing as I have seen a lot of other posts! Thank you very much, great job!
ReplyDelete