Yocto 프로젝트에서는 CI와 연동하여 QEMU에서 자동화 테스트를 할 수 있는 image test framework인 oeqa를 제공을 한다. 이 테스트는 ssh를 통해 타깃 시스템에서 실행이 되고 테스트 스크립트를 파이썬으로 작성이 된다. 이 테스트의 구현 사항은 testimage.bbclass에 구현이 되어 있다.
위의 그림은 Yocto QEMU 이미지 빌드후 QEMU를 실행하는 과정이다. Yocto 자동화 테스트를 하려면 테스트 환경 설정 및 테스트 케이스를 파이썬 스크립트로 작성해야 한다.
테스트 케이스 구현
테스트 케이스는 일반적으로 <meta-layer>/lib/oeqa/runtime/cases 에 위치를 한다. Poky의 테스트 케이스를 참고하려면 다음 링크를 가서 하나씩 살펴보면 된다.
아래 예제는 connman 실행 예제이다. 몇가지 짚어보면
- 테스트 케이스 함수 이름: test_ 로 시작
- OETestDepends: 이 테스트 케이스의 의존성
- OEHasPackage: connman 패키지가 설치되어 있어야 함
아래는 test_connmand_help라는 help 옵션을 주는 것과 connmand_running라는 ps로 connman 서비스가 실행되고 있는지 두가지 테스트를 진행한다.
from oeqa.runtime.case import OERuntimeTestCase
from oeqa.core.decorator.depends import OETestDepends
from oeqa.runtime.decorator.package import OEHasPackage
class ConnmanTest(OERuntimeTestCase):
def service_status(self, service):
if 'systemd' in self.tc.td['DISTRO_FEATURES']:
(_, output) = self.target.run('systemctl status -l %s' % service)
return output
else:
return "Unable to get status or logs for %s" % service
@OETestDepends(['ssh.SSHTest.test_ssh'])
@OEHasPackage(["connman"])
def test_connmand_help(self):
(status, output) = self.target.run('/usr/sbin/connmand --help')
msg = 'Failed to get connman help. Output: %s' % output
self.assertEqual(status, 0, msg=msg)
@OETestDepends(['connman.ConnmanTest.test_connmand_help'])
def test_connmand_running(self):
cmd = '%s | grep [c]onnmand' % self.tc.target_cmds['ps']
(status, output) = self.target.run(cmd)
if status != 0:
self.logger.info(self.service_status("connman"))
self.fail("No connmand process running")
Yocto에서 테스트 환경 설정 및 빌드
local.conf 파일이나 다른 configuration 파일에 아래와 같이 설정한다.
INHERIT += "testimage"
실행은 아래와 같이 -c testimage 를 주면 빌드를 한 후 QEMU를 실행하고 TEST_SUITS 변수에 정의된 테스트 케이스를 하나씩 실행한다.
TEST_SUITS은 image 레시피나 configuration 파일에서 아래와 같이 정의하면 된다. 변수내 들어갈 항목은 테스트 케이스 파이썬 파일 이름이다.
TEST_SUITES = "ping ssh df connman syslog xorg scp vnc date rpm dnf dmesg"
실행
bitbake core-image-sato -c testimage
실제 개발에서 적용
지금 프로젝트에서도 위의 테스트를 적용하고 있다. systemd 서비스가 잘 돌아가는지 service_probe 테스트 항목, booting time, coredump 확인, 각 컴포넌트의 테스트 항목등을 만들어서 CI 빌드 후 테스트가 자동으로 돌고 있다.
현재 문제점은 random 실패 확률이 많아서 이슈를 찾아 고치는 중이고 실제로 여기서 나오는 coredump등이 프로젝트에 도움이 되고 있다. 약간 고민스러운건 항상 모든 테스트를 전부 해야하는가? 수정사항에 의존성 있는 테스트 케이스만 할 것인가? 등이고 random 실패가 없다면 다하겠지만 현재 수정하려고 하는건 기본 사항 테스트 + 수정사항에 관련된 테스트만 활성화 시키려고 구현중에 있다.
한가지 단점(?)이라고 말할 수 있는 건 AWS를 사용하고 있는데 kvm을 활성화 시키기 위해 bare metal EC2 Instance만 지원한다는 것이다. 안그러면 속도가 너무 느려서 문제가 있다.
Reference
'Yocto' 카테고리의 다른 글
초보자들이 볼만한 Yocto 소개 자료 (2) | 2023.09.22 |
---|---|
Yocto 개발 환경 (SDK, eSDK, devtool 등) (0) | 2023.09.21 |
Yocto에 ccache 사용 - 1부 (0) | 2023.08.11 |
Yocto Overrides 문법 변화 (0) | 2023.08.04 |
Yocto 빌드 통계 (buildstat) 시각화 (0) | 2023.08.03 |