반응형

[googletest] gtest_main.cc를 라이브러리에 포함시키기

 

아래 링크에서 main 함수를 넣었는데, main 함수에서 동작이 고정되어 있다면, googletest에서 제공하는 gtest_main.cc의 main 함수를 이용할 수 있습니다. 이 gtest_main.cc의 main 함수를 library에 포함시켜서, 유닛 테스트 코드에서의 main은 사용하지 않도록 해보겠습니다. 

 

https://zidarn87.tistory.com/617

 

[googletest] googletest 다운로드 및 간단한 유닛 테스트 케이스 수행하기 - 리눅스 용

[googletest] googletest 설치 및 간단한 테스트케이스 수행하기 리눅스 우분투 20.04 버전에서 googletest 코드를 다운로드하고, googletest 코드로 정적 library를 만든 다음, 이 library를 가지고 간단한 테스트

zidarn87.tistory.com

 

기존 코드 - 유닛 테스트 코드에 main 함수를 구현함

아래 main 함수를 보면 gtest 라이브러리를 초기화하는 부분과 모든 단위 테스트를 수행하는 명령이 있습니다. 

이 부분은 항상 고정으로 사용한다면 gtest_main.cc의 main 함수를 이용하면 됩니다.

#include <gtest/gtest.h>

TEST(Sample, Test1){

}

TEST(Sample, Test2){
  FAIL();
}

int main(int argc, char** argv){

    testing::InitGoogleTest(&argc, argv);
    return RUN_ALL_TESTS();
}

gtest_main.cc를 라이브러리화

우선 아래 명령어를 이용하여 gtest_main.cc를 빌드합니다. 

g++ googletest-1.13.0/googletest/src/gtest_main.cc -c -I ./googletest-1.13.0/googletest/include/

빌드하면 gteste_main.o 파일이 생성되는 것을 볼 수 있습니다.

gtest-all.o와 gtest_main.o 를 library에 포함시킵니다. 

ar rcv libgtest.a gtest-all.o gtest_main.o

 

유닛 테스크 코드의 main 함수를 제거하고 빌드하기

아래와 같이 main 함수를 제거하고, 테스트 케이스 코드만 작성합니다.

#include <gtest/gtest.h>

TEST(Sample, Test1){

}

TEST(Sample, Test2){
  FAIL();
}

빌드하고, 실행해봅니다. 

빌드도 잘 수행되었고, 테스트 케이스도 잘 수행된 것을 볼 수 있습니다.

반응형
반응형

[googletest] googletest 설치 및 간단한 테스트케이스 수행하기

 

리눅스 우분투 20.04 버전에서 googletest 코드를 다운로드하고, googletest 코드로 정적 library를 만든 다음, 이 library를 가지고 간단한 테스트케이스를 수행하여 보겠습니다. 

 

googletest 설치하기

우선 아래 경로에 접속합니다.

https://github.com/google/googletest

 

GitHub - google/googletest: GoogleTest - Google Testing and Mocking Framework

GoogleTest - Google Testing and Mocking Framework. Contribute to google/googletest development by creating an account on GitHub.

github.com

최신 release 버전을 다운받기 위해 아래 빨간색 부분을 클릭합니다.

아래 링크의 주소를 복사합니다.

https://github.com/google/googletest/archive/refs/tags/v1.13.0.tar.gz

아래 명령어로 파일을 다운로드하고, 압축을 해제합니다.

wget https://github.com/google/googletest/archive/refs/tags/v1.13.0.tar.gz
tar xvf v1.13.0.tar.gz

압축해제하면 googletest-1.13.0 이라는 폴더가 생성되는 것을 볼 수 있습니다.

 

gtest-all 빌드 및 라이브러리로 만들기

모든 src를 가지고 있는 gtest-all.cc 파일을 빌드합니다.

g++ googletest-1.13.0/googletest/src/gtest-all.cc -c -I ./googletest-1.13.0/googletest/include/ -I ./googletest-1.13.0/googletest/

빌드가 완료되면 gtest-all.o 파일이 생성되는 것을 볼 수 있습니다.

이 파일을 가지고 libgtest.a 이라는 라이브러리를 만들어 봅니다.

ar rcv libgtest.a gtest-all.o

 

간단한 테스트 케이스 수행하기

아래의 코드 내용으로  simple.cpp를 생성합니다.

#include <gtest/gtest.h>

// 테스트케이스
TEST(Sample, Test1){

}

TEST(Sample, Test2){
	FAIL();
}

int main(int argc, char** argv){
    testing::InitGoogleTest(&argc, argv);
    return RUN_ALL_TESTS();
}

 

아래 명령어로 simple.cpp를 빌드하는데, 위에서 만든 libgtest.a 라이브러리를 로드합니다.

g++ simple.cpp -lgtest -L. -I./googletest-1.13.0/googletest/include/ -pthread

빌드하면 a.out 파일이 생성되는데, 이를 실행하면 테스트 수행 결과가 출력됩니다.

반응형
반응형

[SOME/IP] vsomeip 다운로드, 빌드, 설치 및 실행하기 - 리눅스 용  

ubuntu 20.04 버전에서 vsomeip 빌드하고, routingmanagerd를 실행하여 보도록 하겠습니다!

 

git  및 cmake 설치하기

git으로 코드를 clone해야하기 때문에 우선 git을 먼저 설치해봅니다.

아래 명령어를 이용해 설치합니다. 

apt install git
apt install cmake

vsomeip git 다운로드 및 빌드하기

아래 명령어로 최신 vsomeip git을 clone합니다. 

# git clone https://github.com/COVESA/vsomeip.git

git clone을 하면 아래와 같이 최신 코드를 받아오는 것을 볼 수 있습니다. 

 

그럼 이제 아래 명령어를 이용하여 빌드해보도록 하겠습니다.

mkdir build
cd build
cmake ..
make

위 명령어를 따라하면 아래와 같이 빌드가 시작됩니다. 

빌드하는데 시간이 조금 오래 걸립니다. 

빌드가 완료되면 아래와 같이 so library 파일이 생성되고, examples 폴더 안에는 routingmanagerd binary가 생성되는 것을 볼 수 있습니다. 

 

빌드된 vsomeip 파일 설치하기

아래 명령어를 이용하여, 빌드된 결과물들을 리눅스 시스템에 설치합니다.

make install

 

routingmanagerd 실행하기

routingmanagerd를 실행하면 아래와 같이 로그가 출력되는 것을 볼 수 있습니다

반응형
반응형

[C++11] std::bind, std::placeholders 사용법

 

std::bind란?

함수 템플릿 바인드는 함수에 대한 전달 호출 wrapper를 생성합니다. 전달 인자를 설정할 수 있는 함수 포인터라고 보시면 됩니다. 
 

std::bind 사용 방법

template< class F, class... Args >
/*unspecified*/ std::bind( F&& f, Args&&... args );
 
f - 일부 인수에 바인딩되는 호출 가능한 객체입니다.(함수 객체, 함수에 대한 포인터, 함수에 대한 참조, 멤버 함수에 대한 포인터 또는 데이터 멤버에 대한 포인터)

args - 바인드할 전달인자 목록입니다. 바인딩되지 않은 인수는 namespace std::placeholders의 자리 표시자 _1, _2, _3...으로 대체될 수 있습니다. 
 

std::placeholder 이란?

보통 std::bind와 같이 많이 쓰이며, 함수의 인자를 받을 수 있도록 해줍니다. 
std::placeholders::_1, std::placeholders::_2, ..., std::placeholders::_N 형식으로 사용됩니다. 
 

std::bind, std::placeholder의 header 파일

#include <functional>
 

std::bind, std::placeholder의 사용 예제

#include <iostream>
#include <functional>


void add(int n1, int n2) {
    std::cout << "n1 = " << n1 << ", n2 = " <<  n2 << std::endl;
    std::cout << "add = " << n1 + n2 << std::endl;
}

void sub(int n1, int n2) {
    std::cout << "n1 = " << n1 << ", n2 = " << n2 << std::endl;
    std::cout << "sub = " << n1 - n2 << std::endl;
}

int main() {
    auto f1 = std::bind(add, 100, std::placeholders::_1);
    f1(5); // add(100, 5) 형식으로 호출됩니다.

    auto f2 = std::bind(sub, std::placeholders::_1, std::placeholders::_2);
    f2(10, 7); // sub(10, 7) 형식으로 호출됩니다.

    return 0;
}

 

 
 
 
 

참조

https://en.cppreference.com/w/cpp/utility/functional/bind

std::bind - cppreference.com

(1) template< class F, class... Args > /*unspecified*/ bind( F&& f, Args&&... args ); (since C++11) (until C++20) template< class F, class... Args > constexpr /*unspecified*/ bind( F&& f, Args&&... args ); (since C++20) (2) template< class R, class F, clas

en.cppreference.com

https://en.cppreference.com/w/cpp/utility/functional/placeholders

std::placeholders::_1, std::placeholders::_2, ..., std::placeholders::_N - cppreference.com

/*see below*/ _1; /*see below*/ _2; . . /*see below*/ _N; The std::placeholders namespace contains the placeholder objects [_1, ..., _N] where N is an implementation defined maximum number. When used as an argument in a std::bind expression, the placeholde

en.cppreference.com

 

반응형

+ Recent posts