How to setup googletest on Linux in the year 2012? - c++

I am using Linux machine.
I have download the googletest package from here
However, there is no installation guide or other blogs related on how to set it up properly
The README file is no good that I can't understand what it is talking about?
Can anyone provide a simple example on how to test a simple function inside a .cc file with that gtest package?

Here's what I did and you can adjust as necessary. I downloaded gtest-1.6.0.zip (from the releases page) on my Linux box into ~/Downloads which typed out fully is /home/me/Downloads/
Unzip the contents of gtest-1.6.0.zip into ~/Downloads/gtest-1.6.0/
cd /home/me/Downloads
unzip gtest-1.6.0.zip
Build the gtest library because it's something you need to "include" in your test executable.
Compile the object file gtest-all.o:
g++ -Igtest-1.6.0/include -Igtest-1.6.0 -c gtest-1.6.0/src/gtest-all.cc
Then build the library archive libgtest.a:
ar -rv libgtest.a gtest-all.o
Now you can create your test.cc file in ~/Downloads. Here is an example test file that I used to make sure it compiles.
#include "gtest/gtest.h"
TEST(blahTest, blah1) {
EXPECT_EQ(1, 1);
}
int main (int argc, char** argv) {
::testing::InitGoogleTest(&argc, argv);
int returnValue;
//Do whatever setup here you will need for your tests here
//
//
returnValue = RUN_ALL_TESTS();
//Do Your teardown here if required
//
//
return returnValue;
}
To compile your own test and run it:
g++ -I/home/me/Downloads/gtest-1.6.0/include -pthread test.cc libgtest.a -o test_executable
Then to execute it:
./test_executable
And it should run fine. Modify as necessary from there.

These instructions get the testing framework working for the Debug configuration.
Get Google C++ Testing Framework
1.Download the latest gtest framework
2.Unzip to C:\gtest
Build the Framework Libraries
1.Open C:\gtest\msvc\gtest.sln in Visual Studio
2.Set Configuration to "Debug"
3.Build Solution
Create and Configure Your Test Project
1.Create a new solution and choose the template Visual C++ > Win32 > Win32 Console Application
2.Right click the newly created project and choose Properties
3.Change Configuration to Debug.
4.Configuration Properties > C/C++ > General > Additional Include Directories: Add C:\gtest\include
5.Configuration Properties > C/C++ > Code Generation > Runtime Library: If your code links to a runtime DLL, choose Multi-threaded Debug DLL (/MDd). If not, choose Multi-threaded Debug (/MTd).
6.Configuration Properties > Linker > General > Additional Library Directories: Add C:\gtest\msvc\gtest\Debug
7.Configuration Properties > Linker > Input > Additional Dependencies: Add gtestd.lib
Verifying Everything Works
1.Open the cpp in your Test Project containing the main() function.
2.Paste the following code:
#include "stdafx.h"
#include <iostream>
#include "gtest/gtest.h"
TEST(sample_test_case, sample_test)
{
EXPECT_EQ(1, 1);
}
int main(int argc, char** argv)
{
testing::InitGoogleTest(&argc, argv);
RUN_ALL_TESTS();
std::getchar(); // keep console window open until Return keystroke
}
1.Debug > Start Debugging
If this works you should see the console window open with your test results.

An addendum to James C's answer:
Note that building the library using gtest-1.6.0/src/gtest-all.cc will require you to provide with a main method yourself. If you want to avoid that altogether and use the default implementation of the main method provided by Googletest, build your library including gtest_main.cc.
That is:
g++ -Igtest-1.6.0/include -Igtest-1.6.0 -c gtest-1.6.0/src/gtest-all.cc gtest-1.6.0/src/gtest_main.cc
^^^^^^^^^^^^^^
ar -rv libgtest_main.a gtest_main.o gtest-all.o
^^^^^^^^^^^^
Also, keep in mind that implementing your own main method is not the recommended way of defining the SetUp and TearDown behaviours; you should be using fixtures instead. Check the Googletest documentation on the topic.

Related

How to run GTest (GoogleTest) for C/C++ application in Xcode 12 and macOS Big Sur 11

I have setup little project in Xcode 12 on my macOS Big Sur to run my tiny math library, but now I want to test if it is working correctly. For that I chose GTest - Google Testing Framework aka googletest. It would be nice if someone told me how to execute it, so that I could make my first test suite?
math.hpp
class Vector {
public:
float x, y;
};
class Point {
public:
float x, y;
Point AddVector(Vector v);
};
math.cpp
#include "math.hpp"
Point Point::AddVector(Vector v) {
Point p2;
p2.x = this->x + v.x;
p2.y = this->y + v.y;
return p2;
};
If you want to skip boring stuff, you can just brew install googletest
Ensure you have xcode-select --install'ed on your system (git, clang and other goodies)
Install CMake - googletest way of generating makefile build - simply called a buildsystem
clone git repository from github.com - git clone https://github.com/google/googletest.git -b release-1.10.0
Then:
cd googletest # Main directory of the cloned repository.
mkdir build # Create a directory to hold the build output.
cd build
cmake .. # Generate native build scripts for GoogleTest.
make
sudo make install # Install in /usr/local/ by default
You want this to work in Xcode, so now it would be great time to visit your project settings.
Click File > New > Target, choose Command Line Tool, name it to something memorable like MainTest, pick your project from drop-down menu and language to be C++ here.
From left pane, choose your project and then from targets pick the one newly created, go to build settings, and search for header search paths, add new row with /usr/local/include/ - path to your libraries (you may even be more selective and only add /usr/local/include/gtest)
In the same tab, build settings, search for other linker flags and add row with -l gtest linker flag
Last Xcode configuration step is just to add /usr/local/lib to your library search paths in the same, build settings tab.
Revisit all above steps where you added path, library search paths, and header search paths, to make sure they are set to be recursive - otherwiese specify absolute path to library/header file
In the last step, you should already have everything set-up properly, it's just a matter of writing your test files and a test-runner.
For a test you should employ a red-green-refactor principle, so I will provide you with a failing test:
//math_test.cpp
#include <gtest/gtest.h>
#include <math.h>
namespace {
TEST(TestingTest, AddVector) {
EXPECT_EQ(1, 2);
}
}
and a test runner, in the simplest form, should look like this:
//main.cpp
#include <gtest/gtest.h>
int main(int argc, const char * argv[]) {
testing::InitGoogleTest(&argc, (char**)argv);
return RUN_ALL_TESTS();
}

Qt : Unit Test with Visual Studio

I have a Visual Studio Project and want to write some Unit Test for it.
I tried doing that by using a "Native Unit Test Project".
The Problem is, that when I use a QString in the Test, the Test fails with following message:
Message: Failed to set up the execution context to run the test
Any suggestions how I can write Unit Test using Qt?
#include "stdafx.h"
#include "CppUnitTest.h"
#include <QtCore/QCoreApplication>
using namespace Microsoft::VisualStudio::CppUnitTestFramework;
namespace Test
{
TEST_CLASS(UnitTest1)
{
public:
TEST_METHOD(TestMethod1)
{
QString a = "Test";
Assert::IsTrue(true);
}
};
}
I have tried with the above example of yours and i am able to compile the unit test. These are the following changes I've done apart from copying your code.
Check if your QT is built with 32 bit or 64 bit compiler.
You need to set the same in Solution Platforms.
You need to add include directory path and the lib file path(Qt5Cored.lib(for
debug)/Qt5Core.lib(for release)) in the Project properties.
To run the unit test you need to copy the
Qt5Cored.dll/Qt5Core.dll file in the folder where your unit test dll file is generated(After compilation).
PS:- I am using VS 2015 but this doesn't matter.
I have also ran into this issue with Qt6 with a project created using the Qt Visual Studio Tools extension for Visual Studio 2019.
QString was one of the things popping up as an error during the build process, but there was various more errors. My solution was as follows:
Gone to the Microsoft Unit Testing Framework for C++ project's Properties (right-click on solution, bottom option of the menu "Properties")
As mentioned in #sonulohani's response, I had it running in x64 by default.
Under Configuration Properties > Linker > General Additional Library Directories I added the path to my QT installation location libs folder (for me this was C:\Qt\6.1.2\msvc2019_64\lib) at the top of the list.
Under Configuration Properties > Linker > Input Additional Dependencies I added a link to all the "*.lib" files from that very same QT installation (for me, this was C:\Qt\6.1.2\msvc2019_64\lib\*.lib) AND a link to the build output .obj files for the Qt project ($(SolutionDir)<MY PROJECT NAME>\$(IntDir)*.obj where <MY PROJECT NAME> was my project name). This second part may not necessarily be needed.
Copying just the Qt6Core.dll/Qt6Cored.dll as suggested by #sonulohani did not work. It was still missing stuff. So in the properties, under Configuration Properties > Build Events > Post-Build Event Command Line I added this script to copy all the Qt6 dll files to the test project .dll output directory:
for %%f in (C:\Qt\6.1.2\msvc2019_64\bin\Qt6*.dll) do #copy /y %%f $(SolutionDir)$(Platform)\$(Configuration)\Tests\
Now at that point I had another issue, since both my test project and my actual Qt project was dumping its files into the same output directory, and the Qt project did not like having all those dlls in there and did not run anymore. So I created the $(SolutionDir)$(Platform)\$(Configuration)\Tests\ directory within the regular output directory, and also made this \Tests\ subdirectory the output directory for the test project (Configuration Properties > General Output Directory).

Xcode External Build System Project Can't Find wchar.h

I'm trying to figure out how to use Xcode's "External Build System" project template to do some C++ coding. I've set it up with a very simple test project, just to make sure that I understand the configuration. I'm using make to build the project. When I try to run it, the build fails with the error message 'wchar.h' file not found.
Here are the steps I took to set up the project:
Create a new Project, using the Other -> External Build System template.
Set the Build Tool option to /usr/bin/make.
Copy my source file, ex_3_4.cpp to the directory where the Xcode project is located, and add it to the project using the Add files to "TestProject"... menu option.
Copy the makefile to the directory where the Xcode project is located.
Everything works if I run make from the terminal - I get an executable that runs fine, and there is no trouble finding wchar.h or any other headers. So I know that this is a problem with something in the project settings.
Here is the code in the source file:
#include <iostream>
using namespace std;
int main()
{
cout << "Hello World!\n";
}
And here is my makefile:
all:
clang++ ex_3_4.cpp -o ex_3_4
clean:
rm ex_3_4
I can't find any place in the project settings where I can specify a search path for the wchar.h file (or any other header files for that matter), so I'm not sure how to fix this. I feel like it must be something simple.
If it makes any difference, I've been using Xcode 7.3, but I've also tried it with the new Xcode 8.0. I get the same error message using either version.
Perhaps you want to add a library target to your project, add it as a dependency on your project and then, your .h into the Headers section

How to create a cross-platform C++ application in Netbeans?

I am experiencing some difficulties while creating a simple "Hello world" cross-platform C++ app in Netbeans 8.0.1 for both Linux and Windows operating systems. I found very few instructions for Windows and none for Linux (my OS is Ubuntu 14.04).
My research over the Internet brought me to a conclusion that there should be created one more makefile for Windows OS. Usually, while creating a C++ project Netbeans kindly proposes us to create a makefile for us. And it's great, but it's just for Linux.
I stuck on Makefile creation (never done this before manually), so these were my steps to creating makefile for Windows:
Right Click on Project -> New -> Makefile
File Name: "Makefile-Windows" -> Next
Compiler: GNU Compilers, Platform: Windows -> Next
Base Directory: Project directory -> Next
Target Name: hello-world ( "Executable" radio button ) -> Add -> Next
Directory for All created files: GNU-amd64-Windows -> Next
Enter source files: main.cpp -> Next
Directories to Search for Include Files: Left empty -> Next
Choose libraries to link with: None, Link mode: Dynamic Linking -> Next
Libraries to link with: Left empty -> Next
How would you like your code to be built?: Dev. mode -> Next
, 13. Compiler options: Left default -> Finish
As a result, after making this fresh baked makefile in my GNU-amd64-Windows folder appears an object file (main.o) and an executable file (hello-world), but still executable only in Linux. When I try to run it in Windows command line, I get the error:
"Bad Command or file name"
Just in case here is my main.cpp content:
#include <iostream>
int main( int argc, char** argv )
{
std::cout << "Hello world" << std::endl;
return 0;
}
If I have chosen a wrong way, then how should it be done?
As mentioned Borgleader, only C++ code can be cross-platform. Here is my solution:
Firstly, we shouldn't use Linux GCC compiler for compiling Windows applications. That's why we need to install Windows compiler for Linux:
sudo apt-get install mingw32 mingw32-binutils mingw32-runtime
Secondly, while creating makefile we should specify alternative compiler. Use:
/usr/bin/i586-mingw32msvc-g++
insteat of default:
g++
Finally, after making this makefile our output file becomes executable on Windows platforms.

using googletest in eclipse: how?

I've downloaded google test, but now I've no idea on how to link it to my project in eclipse.
Should I add it as a source folder? Should include it as g++ included library? And how can I run test then?
Using Riga's excellent answer, here is a summary of how I got it to work:
Created a new C++ project in Eclipse (I chose Executable > Empty Project)
Downloaded googletest 1.5.0, untarred, and ran ./scripts/fuse_gtest_files.py . <project-dir>/contrib
Back in Eclipse, excluded the contrib directory from the Release build configuration, and added <project-dir>/contrib to the include directories (odd, I know)
Added a src directory and added a class named Foo (see below for the contents of Foo.h--I left Foo.cpp empty for now)
Added a test directory in Eclipse, excluded it from the Release build configuration, added <project-dir>/contrib to the include directories, and added new source files FooTest.cpp and AllTests.cpp (see below for contents)
Built and ran the project!
Foo.h:
#ifndef FOO_H_
#define FOO_H_
class Foo {
public:
virtual ~Foo();
Foo();
bool foo(void) { return true; }
};
#endif /* FOO_H_ */
FooTest.cpp:
#include "gtest/gtest.h"
#include "Foo.h"
namespace {
class FooTest : public ::testing::Test {
protected:
Foo foo;
};
TEST_F(FooTest, Foo) {
ASSERT_TRUE(foo.foo());
}
}
AllTests.cpp:
#include "gtest/gtest.h"
#include "FooTest.cpp"
int main(int argc, char **argv) {
::testing::InitGoogleTest(&argc, argv);
return RUN_ALL_TESTS();
}
Here are the detailed steps:
In Eclipse, open the File menu and select New > C++ Project
Project Type: Executable > Empty Project
Toolchain: Linux GCC
Click Finish
Open a terminal and cd /tmp
wget http://googletest.googlecode.com/files/gtest-1.5.0.tar.bz2
cd gtest-1.5.0/
./scripts/fuse_gtest_files.py . <project-dir>/contrib
Back in Eclipse, right-click on the project folder in the Project Explorer pane, then select Refresh
In the Project Explorer pane, right-click on the contrib folder, select Exclude from build...*, untick only the **Release box, and click OK
Right-click on the contrib folder and select Properties > C/C++ Build > Settings > Tool Settings tab > GCC C++ Compiler > Directories
Click on the Add... button, then the Workspace... button, then select <project-name>/contrib and click OK to add the directory
Click OK once more to accept your changes to the build settings
Right-click on the project in the Project Explorer pane and select New > Folder, enter src as its name, and click OK
Right-click on the src folder in the Project Explorer pane and select New > Class, name it Foo, then click OK (see above for contents of Foo.h; Foo.cpp can be left as is)
Right-click on the project in the Project Explorer pane and select New > Folder, enter test as its name, and click OK
Follow the steps above to add <project-name>/contrib and <project-name>/src as include directories to the test directory
Right-click on the test folder, then select New > Source File to add AllTests.cpp to the test folder, then repeat the same steps to add FooTest.cpp (see above for contents)
Right-click on FooTest.cpp and select Exclude from build..., click the Select All button, then OK
Right-click on the project in the Project Explorer pane, and select Properties > C/C++ Build > Settings > Tool Settings tab > GCC C++ Linker > Libraries, then click the Add... button, enter pthread (required by googletest), click OK to add the library, then OK once more to accept the changes
Hit Ctrl-b to build the project
Hit Ctrl-F11 to run the project
Victory!
Step 1 Install Eclipse
If Eclipse is not already installed on the machine, then get the latest version of the Eclipse IDE for C/C++ Developers from the Eclipse downloads page (http://www.eclipse.org/downloads/).
If Eclipse is already installed but only for Java, download the C++ plug-in following these instructions.
a. Open Eclipse and click on Help->Install New Software
b. In the Work with: box, type in http://download.eclipse.org/tools/cdt/releases/kepler. After a few moments, the Name box will populate. Select the following components:
CDT Main Features -> C/C++ Development Tools
CDT Main Features -> C/C++ Development Tools SDK
CDT Optional Features -> C/C++ Unit Testing Support
CDT Optional Features -> C/C++ Unit Testing Support Source
CDT Optional Features -> C/C++ Visual C++ Support
c. Click on Next, agree to the statements, and then Finish.
Step 2 Download Cygwin
Install Cygwin by clicking on the setup-x86_64.exe link on the Cygwin install page (http://www.cygwin.com/install.html). After running, click Next through the defaults until you get to the Select Packages window.
You will need to search for and install two packages: gcc and make.
The first search term is gcc. Search for gcc and then open the Devel folder. Mark the following packages for install by clicking on the word Skip (it will then change to the build number, which may by higher than the one depicted here): gcc-core, gcc-g++, and libgcc1.
The second search term is make. Here, we will only need the Devel package make.
Once these have been selected, click Next to install.
Step 3 Download and build Google Test project
Download the latest release of GoogleTest from https://code.google.com/p/googletest/downloads/list, and extract the zip file contents into a common directory. It is important that all users are able to access this directory.
(Note: the following commands use make -- the last revision of GoogleTest that uses make is https://github.com/google/googletest/releases/tag/release-1.8.1. For future revisions of GoogleTest use cmake instead.)
To build the Google Test project:
Open Cygwin (find the install directory for Cygwin and double-click
on Cygwin.bat).
Change the current working directory to the unzipped
GoogleTest make directory: cd c:/<<yourpath>>/gtest-1.7.0/make/
Build the project: make
Create an archived library out of the
gtest-all.o file: ar -rv libgtest.a gtest-all.o
Step 4 Add the Cygwin bin directory to the computers PATH variable
Follow the instructions on this page for your version of Windows: http://www.java.com/en/download/help/path.xml, to add Cygwins bin directory to the computers PATH environment variable. (typically by adding ;C:\cygwin64\bin to the end of the current value).
Step 5 Create a new project that uses GoogleTest
Start Eclipse and select File->New->C++ Project. Enter the values below and click Finish.
In the Project Explore, right-click the name of the project and select Properties. Under C/C++ Build, change the Builder type to Internal Builder.
Under C/C++ Build, select Settings, then click on the Includes folder under Cygwin C++ Compiler. Click on the Add button in the top box and then browse to the GoogleTest include folder.
Lastly, under the Cygwin C++ Linker folder, select Miscellaneous and then click the Add icon under Other objects. Find the libgtest.a file that you built back in step 3 (it should be in the make directory of the unzipped gtest folder).
Thats it! Now you're ready to try it out.
Step 6 Write some code that uses GoogleTest
Add a source folder by clicking File->New->Source folder. Call it
src.
Add a header file by right-clicking on the src folder and select New->Header File. Call this file Counter.h.
Add a source file by right-clicking on the src folder and select New->Source File. Call
this file Counter.cpp.
Add another source file and call it Counter_Tests.cpp.
Copy and paste the code below into the appropriate files:
Counter.h
class Counter {
private:
int mCounter;
public:
Counter() : mCounter(0) {}
int Increment();
};
Counter.cpp
#include <stdio.h>
#include "Counter.h"
int Counter::Increment() {
return mCounter++;
}
Counter_Tests.cpp
#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());
}
int main(int argc, char **argv) {
::testing::InitGoogleTest(&argc, argv);
return RUN_ALL_TESTS();
}
In the Project menu select Build All. Now, to connect up the GoogleTest unit testing framework, select Run Configurations from the Run menu. From this dialog, select C/C++ Unit and click the New button.
It should fill in this project name automatically under C/C++ Application, if not click on Search Project to select this project. Next, click on the C/C++ Testing tab. In the Tests Runner drop-down, choose Google Tests Runner, and then click Run to watch the magic!
Below is a snapshot of the result. After writing more code/tests, you can click on the button highlighted in red to quickly recompile and re-run all of the tests.
You should not add it to your source folder, make separate folder instead. This is for avoidance of dependency of your production code from testing project. Do it like this
../ #your project folder
Makefile
src/
module1 #some module
module2 #another module
build #tmp for build
dist #binaries
contrib/
gtest
...
test/ #your test project folder
Makefile
src/
module1 #correspondent to main project's one
module2 #correspondent to main project's one
build
dist
...
I usually use google test as two files, this is very handy. Use scripts/fuse_gtest_files.py from gtest distribution to extract them. Having only two files you can include their compilation in your test project compilation and have simple project structure.
In your test projectspecify include directories ../contrib:../src:src.
Thus you can include headers like this
test/src/module1/class1Test.h:
#include "gtest/gtest.h"
#include "module1/class1.h"
// test class1 here
// ...
test/src/mainTest.cpp:
#include "gtest/gtest.h"
#include "module1/class1Test.h"
#include "module2/class2Test.h"
// include other tests you have
// ...
int main(int argc, char** argv) {
::testing::InitGoogleTest(&argc, argv);
return RUN_ALL_TESTS();
}
Here is my solution for Eclipse 4.3 and CDT 8.2
I felt this was somewhat easier then described above.
Download gtest and install it as described in the readme.txt (using cmake and make in linux)
Go to "YourProject-> Properties-> C/C++ Build-> Settings-> GCC C++ Compiler-> Includes-> Include paths" and add the include folder in gtest
Go to "YourProject-> Properties-> C/C++ Build-> Settings-> GCC C++ Linker-> Libraries", add the gtest folder as search path and add libraries "gtest" and "pthread"
(4. If you have tests in the same project as sources exclude tests from release build)
Go to "Run-> Run Configurations..." and Create a new C/C++ Unit run configuration
Set project to your project and C/C++ Application to your Application in main tab. Set Tests Runner to Google Test Runner in C/C++ Testing tab.
(7. Error notifications may stick around in the eclipse gui, if this is the case re-indexing the project might help)
I've tray your solution and it runs well. I can say that for compile gtest is not very clear in the README. txt.
I've run the makefile in the /make directory through a cygwin console.
In my case the compiler advise me that don't findt the pthread library. So I modified the line
CXXFLAGS += -g -Wall -Wextra -pthread
and changed it to
CXXFLAGS += -g -Wall -Wextra -lpthread
The output I get is gtest_main.a. Then I have rename this file into libgtest.a and copy it to C:\cygwin\lib directory.
Then i've configure my eclipse project to use cygwin and added gtest and pthread as you say... and it works!
I hope it can help someone