ເຄື່ອງມືຈັດການການທົດສອບ (Test Management Tool)

ບົດສະຫຼຸບຫຍໍ້

ເຄື່ອງມື tmt ມີຈຸດປະສົງເພື່ອສະໜອງວິທີການທີ່ມີປະສິດທິພາບ ແລະ ສະດວກສະບາຍໃນການສ້າງ, ດຳເນີນການ, ກວດສອບຂໍ້ຜິດພາດ ແລະ ເປີດໃຊ້ງານການທົດສອບໃນລະບົບ Continuous Integration.

ມັນໄດ້ນຳໃຊ້ Test Metadata Specification ເຊິ່ງຊ່ວຍໃຫ້ສາມາດເກັບກຳຂໍ້ມູນການທົດສອບທີ່ຈຳເປັນທັງໝົດໄວ້ໃນ git repository ໂດຍກົງ. ສາມາດໃຊ້ການກຳນົດຄ່າແບບດຽວກັນນີ້ເພື່ອເປີດໃຊ້ງານການທົດສອບໃນ Fedora CI, RHEL CI ແລະ Packit. ການທົດສອບສາມາດດຳເນີນການໄດ້ຢ່າງງ່າຍດາຍໃນສະພາບແວດລ້ອມທີ່ເຈົ້າຕ້ອງການ ເຊັ່ນ: ໃນເຄື່ອງຈຳລອງ (virtual machine), ຄອນເທນເນີ (container) ຫຼື ບົນເຄື່ອງ localhost ໂດຍກົງ.

ຂັ້ນຕອນທຳອິດ

ຕິດຕັ້ງ

ຕິດຕັ້ງ tmt ລົງໃນແລັບທັອບຂອງເຈົ້າ:

sudo dnf install -y tmt       # ຄຸນສົມບັດພື້ນຖານ, ດຳເນີນການທົດສອບບົນ localhost
sudo dnf install -y tmt+all   # ຕິດຕັ້ງທຸກ subpackages ຂອງ tmt ທີ່ມີ່ ລວມທັງ dependencies ທັງໝົດ

ເຈົ້າສາມາດເລືອກຕິດຕັ້ງສະເພາະ provision plugins ທີ່ຕ້ອງການໄດ້:

sudo dnf install -y tmt+provision-container   # dependencies ເພີ່ມເຕີມສຳລັບການທົດສອບໃນ containers
sudo dnf install -y tmt+provision-virtual     # ຮອງຮັບການທົດສອບໃນເຄື່ອງຈຳລອງໂດຍໃຊ້ testcloud

ເບິ່ງສ່ວນ install ຂອງ tmt ສຳລັບຕົວເລືອກການຕິດຕັ້ງເພີ່ມເຕີມ.

Git Repo

ກວດສອບ (Check out) ສາຂາ dist git ທີ່ຕ້ອງການໂດຍໃຊ້ fedpkg:

fedpkg clone -a bash
cd bash
git checkout f32

ຫຼື ໂຄລນ (clone) repository ໂຄງການຂອງທ່ານຈາກ GitHub:

git clone https://github.com/teemtee/tmt/
cd tmt
git checkout -b enable-tests

ການທົດສອບເບື້ອງຕົ້ນ (Smoke Test)

ມາລອງເປີດໃຊ້ການທົດສອບເບື້ອງຕົ້ນແບບງ່າຍໆ ໂດຍໃຊ້ແມ່ແບບແຜນແບບນ້ອຍທີ່ສຸດ (minimal plan template):

$ tmt init --template mini
Tree '/tmp/bash' initialized.
Applying template 'mini'.
Directory '/tmp/bash/plans' created.
Plan '/tmp/bash/plans/example.fmf' created.

ແກ້ໄຂແຜນທີ່ສ້າງຂຶ້ນໃໝ່ຕາມຄວາມຕ້ອງການ, ຕົວຢ່າງຄືແບບນີ້:

summary:
    Basic smoke test for bash
execute:
    script: bash --version

ດຳເນີນການທົດສອບ

ສັ່ງທົດສອບ

ດຳເນີນການທົດສອບທີ່ມີທັງໝົດຢ່າງປອດໄພໃນເຄື່ອງຈຳລອງ (virtual machine):

tmt run

ສັ່ງທົດສອບສະເພາະອັນທີ່ກົງກັບຊື່ທີ່ກຳນົດ ຫຼື ຢູ່ໃນ directory ປັດຈຸບັນ:

tmt run test --name smoke
tmt run test --name .

ສະແດງລາຍລະອຽດຜົນການທົດສອບຈາກການສັ່ງ tmt run ຄັ້ງຫຼ້າສຸດຂອງຜູ້ໃຊ້ປັດຈຸບັນ:

tmt run --last report -fvvv

ການດຳເນີນການທົດສອບທີ່ເປີດໃຊ້ໂດຍໃຊ້ Standard Test Interface ໃນ tests/tests.yml ຍັງບໍ່ຮອງຮັບເທື່ອ ແຕ່ພວກເຮົາກຳລັງພັດທະນາຢູ່.

ເລືອກຂັ້ນຕອນ

ເລືອກຂັ້ນຕອນທີ່ຕ້ອງການໃຫ້ເຮັດວຽກໂດຍສະເພາະ:

tmt run discover

ຄຳສັ່ງນີ້ຈະສະແດງພາບລວມຂອງການທົດສອບທີ່ຈະຖືກດຳເນີນການ. ເພື່ອເບິ່ງລາຍການການທົດສອບແຕ່ລະອັນ ໃຫ້ເປີດໃຊ້ verbose mode:

tmt run discover --verbose
tmt run discover -v

ຕົວເລືອກການຈັດກຽມລະບົບ (Provision Options)

ເລືອກ local ເປັນວິທີການຈັດກຽມລະບົບ ແຕ່ໃຫ້ເຮັດວຽກທຸກຂັ້ນຕອນ (--all steps):

tmt run --all provision --how local

ດຳເນີນການພາຍໃນຄອນເທນເນີ ຫຼື ເຄື່ອງຈຳລອງ:

tmt run --all provision --how container --image fedora
tmt run --all provision --how virtual --image fedora-32

ກວດສອບ provision plugins ທັງໝົດທີ່ມີ:

tmt run provision --help

ຕົວເລືອກການກຽມຄວາມພ້ອມ (Prepare Options)

ຕິດຕັ້ງແພັກເກັດເພີ່ມເຕີມໃນເຄື່ອງປາຍທາງ (guest):

tmt run --all prepare --how install --package httpd

ດຶງແພັກເກັດຫຼ້າສຸດຈາກ copr repository ທີ່ກຳນົດ:

tmt run --all prepare --how install --copr @teemtee/tmt --package tmt

ໃຊ້ໄຟລ໌ rpm ທີ່ສ້າງຂຶ້ນໃໝ່ໃນເຄື່ອງ ຫຼື ທຸກໄຟລ໌ rpm ຈາກ directory ໃນເຄື່ອງ:

tmt run --all prepare --how install --package tmp/RPMS/noarch/tmt-0.20-1.fc32.noarch.rpm
tmt run --all prepare --how install --directory tmp/RPMS/noarch

ກວດສອບຕົວເລືອກການກຽມຄວາມພ້ອມທັງໝົດທີ່ມີ:

tmt run prepare --help

ສ້າງການທົດສອບ

ເພື່ອສ້າງການທົດສອບທີ່ມີຄວາມຊັບຊ້ອນຫຼາຍຂຶ້ນ ໃຫ້ໃຊ້ແມ່ແບບແຜນພື້ນຖານ (base plan template):

tmt plan create /plans/basic --template base
tmt plan create /plans/basic -t base

ອັບເດດບົດສະຫຼຸບຕາມຄວາມຕ້ອງການ, ຕັ້ງວິທີການຄົ້ນຫາ (discover method) ເປັນ fmf ແລະ ເລືອກວ່າ ຈະໃຫ້ການທົດສອບເຮັດວຽກເປັນ shell scripts (ກວດສອບພຽງ exit code) ຫຼື beakerlib tests (ກວດສອບ journal ເພື່ອເບິ່ງຜົນການທົດສອບ):

summary:
    Check basic bash features
discover:
    how: fmf
execute:
    how: tmt

ການທົດສອບ Shell

ເພື່ອສ້າງໂຄງສ້າງການທົດສອບ shell ແບບງ່າຍໆ ໃຫ້ໃຊ້ແມ່ແບບ shell:

$ tmt test create /tests/smoke
Template (shell or beakerlib): shell
Directory '/tmp/bash/tests/smoke' created.
Test metadata '/tmp/bash/tests/smoke/main.fmf' created.
Test script '/tmp/bash/tests/smoke/test.sh' created.

ອັບເດດໄຟລ໌ metadata:

summary: Check bash version
contact: Petr Šplíchal <psplicha@redhat.com>
test: ./test.sh

ປັບແຕ່ງ test script ຕາມຄວາມຕ້ອງການ:

#!/bin/sh -eux
tmp=$(mktemp)
bash --version > $tmp
grep 'GNU bash' $tmp
grep 'Free Software Foundation' $tmp
rm $tmp

ໃຊ້ຄຳສັ່ງ tmt run ເພື່ອຢືນຢັນວ່າການທົດສອບເຮັດວຽກຕາມທີ່ຄາດໄວ້.

ການທົດສອບ BeakerLib

ໃຊ້ແມ່ແບບ beakerlib ເພື່ອສ້າງການທົດສອບ beakerlib ໃໝ່:

$ tmt test create /tests/smoke -t beakerlib
Directory '/tmp/bash/tests/smoke' created.
Test metadata '/tmp/bash/tests/smoke/main.fmf' created.
Test script '/tmp/bash/tests/smoke/test.sh' created.

ອັບເດດ test metadata ແລະ ໂຄ້ດຕາມຄວາມຕ້ອງການ, ຈາກນັ້ນໃຊ້ tmt run ເພື່ອກວດສອບວ່າທຸກຢ່າງເຮັດວຽກໄດ້ດີ.

ການຮ້ອງຂໍດຶງຂໍ້ມູນ (Pull Requests)

ເມື່ອສ້າງ pull request ໃຫ້ແນ່ໃຈວ່າເຈົ້າໄດ້ເພີ່ມທຸກໄຟລ໌ທີ່ສ້າງຂຶ້ນ ລວມທັງ directory ພິເສດ .fmf.

git add .
git commit

Fedora

ເພື່ອທົດສອບການປ່ຽນແປງຂອງເຈົ້າໃນ Fedora CI ແມ່ນບໍ່ຈຳເປັນຕ້ອງມີການກຳນົດຄ່າເພີ່ມເຕີມ. ໃຫ້ແນ່ໃຈວ່າເຈົ້າໄດ້ push ການປ່ຽນແປງໄປຍັງ repository ທີ່ເຈົ້າ fork ມາ ເນື່ອງຈາກ fedora rpms/tests namespace ບໍ່ອະນຸຍາດໃຫ້ເຮັດ force-push ຫຼື ລົບສາຂາ (branch).

git remote add fork ssh://psss@pkgs.fedoraproject.org/forks/psss/rpms/tmt.git
git push fork -u enable-tests

GitHub

ເພື່ອທົດສອບ pull request ໃນ GitHub ໃຫ້ເປີດໃຊ້ການເຊື່ອມຕໍ່ Packit-as-a-Service ແລະ ເພີ່ມໄຟລ໌ກຳນົດຄ່າ .packit.yaml:

jobs:
- job: tests
  trigger: pull_request
  metadata:
    targets:
    - fedora-all

ສຳລັບລາຍລະອຽດເພີ່ມເຕີມ ເບິ່ງເອກະສານຂອງ Testing Farm. ເມື່ອເປີດໃຊ້ການເຊື່ອມຕໍ່ແລ້ວ ໃຫ້ push ສາຂາ, ສ້າງ pull request ໃໝ່ຕາມປົກກະຕິ ແລະ ລໍຖ້າຜົນການທົດສອບ:

git push origin -u enable-tests

ແມ່ແບບ (Templates)

ເມື່ອສ້າງ pull request ເພື່ອເປີດໃຊ້ການທົດສອບໃນ repository ທີ່ຍັງບໍ່ມີການກຳນົດຄ່າ tmt, ຄວນໃສ່ຄຳແນະນຳ ແລະ ລິ້ງຕ່າງໆ ສຳລັບຜູ້ທີ່ຍັງບໍ່ຄຸ້ນເຄີຍກັບເຄື່ອງມືໃໝ່ນີ້:

Pull request ນີ້ເປີດໃຊ້ການທົດສອບໃນ Fedora CI ໂດຍໃຊ້ `tmt` ເຊິ່ງ
ຍັງຊ່ວຍໃຫ້ສາມາດດຳເນີນການ ແລະ ກວດສອບຂໍ້ຜິດພາດຂອງການທົດສອບຈາກແລັບທັອບຂອງເຈົ້າໄດ້ຢ່າງງ່າຍດາຍ:

ສັ່ງທົດສອບໂດຍກົງບົນເຄື່ອງ localhost ຂອງເຈົ້າ:

    sudo dnf install -y tmt
    tmt run --all provision --how local

ສັ່ງທົດສອບໃນເຄື່ອງຈຳລອງ (virtual machine):

    sudo dnf install -y tmt+provision-virtual
    tmt run

ເບິ່ງເອກະສານເພີ່ມເຕີມເພື່ອຮຽນຮູ້ກ່ຽວກັບເຄື່ອງມືນີ້:
https://docs.fedoraproject.org/en-US/ci/tmt/

ຈັດການການທົດສອບ

ສຳຫຼວດການທົດສອບທີ່ມີ, ແປງ metadata ເກົ່າ, ແບ່ງປັນໂຄ້ດການທົດສອບ.

ສຳຫຼວດການທົດສອບ

ເພື່ອເບິ່ງວ່າການທົດສອບໃດແດ່ທີ່ມີຢູ່:

tmt test ls

ເພື່ອສະແດງລາຍລະອຽດເພີ່ມເຕີມກ່ຽວກັບການທົດສອບແຕ່ລະອັນ:

tmt test show

ເພື່ອເບິ່ງພາບລວມຂອງ metadata ທັງໝົດ:

tmt

ສຳຫຼວດຕົວເລືອກ ແລະ ຄຳສັ່ງທັງໝົດທີ່ມີໂດຍໃຊ້ --help.

ແບ່ງປັນການທົດສອບ

ໂຄ້ດການທົດສອບບໍ່ຈຳເປັນຕ້ອງຢູ່ໃນ git repository ດຽວກັນ (ເຊັ່ນ: dist git rpms namespace). ເຈົ້າສາມາດເກັບການທົດສອບໄວ້ໃນ repository ສະເພາະ ແລະ ແບ່ງປັນການທົດສອບນັ້ນໄປຍັງຄອມໂພເນນ ຫຼື ເວີຊັນຜະລິດຕະພັນຕ່າງໆໄດ້. ພຽງແຕ່ອ້າງອີງເຖິງ repository ໃນຂັ້ນຕອນ discover. ໃຊ້ແມ່ແບບແຜນແບບເຕັມ (full plan template) ເພື່ອເລີ່ມຕົ້ນຢ່າງວ່ອງໄວ:

tmt plan create /plans/upstream -t full

ອັບເດດ url ຂອງ repository ໃຫ້ຊີ້ໄປຫາບ່ອນທີ່ຖືກຕ້ອງ:

summary:
    Essential command line features
discover:
    how: fmf
    url: https://github.com/teemtee/tmt
execute:
    how: tmt

ຕອນນີ້ເຈົ້າຈະສາມາດສັ່ງທົດສອບຈາກ repository ທາງໄກໄດ້. ເບິ່ງລາຍລະອຽດໃນເອກະສານ ຂັ້ນຕອນ discover.

ຄຳແນະນຳຕ່າງໆ

ຫຼາຍຄຳສັ່ງ

ສາມາດໃສ່ຫຼາຍຄຳສັ່ງ shell ພາຍໃຕ້ຄຸນລັກສະນະ script ໄດ້ເຊັ່ນກັນ:

summary:
    Basic smoke test for bash
execute:
    script:
        - bash --version
        - bash -c 'echo $((1+1+1))' | grep 3

ເບິ່ງລາຍລະອຽດໃນເອກະສານວິທີການ script.

ຕິດຕັ້ງ Dependencies

ສາມາດຕິດຕັ້ງແພັກເກັດທີ່ຈຳເປັນໄດ້ໂດຍໃຊ້ຄຸນລັກສະນະ prepare:

    summary: Basic smoke test for python3-m2crypto
    prepare:
        how: install
        package:
          - python3-setuptools
          - python3-m2crypto
execute:
script: python3 -c "import M2Crypto"

ເບິ່ງລາຍລະອຽດໃນເອກະສານຂັ້ນຕອນ prepare.

ຫຼາຍ Repositories

ໃນຂັ້ນຕອນ discover, ເຈົ້າສາມາດອ້າງອີງເຖິງຫຼາຍ repositories ໄດ້ເຊັ່ນກັນ. ດ້ວຍວິທີນີ້ ເຈົ້າສາມາດສັ່ງທົດສອບທັງ upstream ແລະ fedora ພ້ອມກັນໃນແຜນດຽວໄດ້ຢ່າງງ່າຍດາຍ:

discover:
  - name: fedora
    how: fmf
    url: https://src.fedoraproject.org/tests/selinux.git
  - name: upstream
    how: fmf
    url: https://github.com/SELinuxProject/selinux-testsuite

ເບິ່ງຕົວຢ່າງ multiple config ໃນ tmt repo ເພື່ອໃຫ້ເຫັນພາບທີ່ຊັດເຈນຂຶ້ນ.

ຫຼາຍແຜນ (Multiple Plans)

ເຈົ້າສາມາດໃຊ້ຫຼາຍແຜນເພື່ອຈັດກຸ່ມການທົດສອບທີ່ກ່ຽວຂ້ອງເຂົ້າກັນ ຫຼື ເພື່ອໃຫ້ສາມາດສັ່ງທົດສອບສະເພາະບາງສ່ວນໄດ້ງ່າຍ. ຕົວຢ່າງ: ໃຫ້ມີແຜນ /plans/features ເຊິ່ງລວມທຸກການທົດສອບຄຸນສົມບັດຈາກ git repository ໃນເຄື່ອງ:

discover:
    how: fmf
execute:
    how: tmt

ແລະ ແຜນ /plans/integration ແຍກຕ່າງຫາກເພື່ອເປີດໃຊ້ການທົດສອບການເຊື່ອມຕໍ່ກັບຄອມໂພເນນອື່ນ:

discover:
    how: fmf
    url: https://src.fedoraproject.org/rpms/ltrace.git
execute:
    how: tmt

ການສັ່ງທົດສອບທັງໝົດຈາກແຜນທີ່ກຳນົດແມ່ນເຮັດໄດ້ງ່າຍຫຼາຍ:

tmt run plan --name /plans/features

ເມື່ອເຮັດວຽກໃນ CI, ຜົນຈາກແຜນເຫຼົ່ານີ້ຈະຖືກລາຍງານເປັນ resultsdb testcase ດຽວ ແລະ ສະແດງໃນ pull requests ເປັນ flag ດຽວ. ເພື່ອເປີດໃຊ້ການແຍກຜົນລາຍງານຂອງແຕ່ລະແຜນ, ໃຫ້ສ້າງໄຟລ໌ ci.fmf ໃນ root ຂອງ git repository ດ້ວຍເນື້ອຫາຕໍ່ໄປນີ້:

resultsdb-testcase: separate

ເມື່ອເປີດໃຊ້ການແຍກລາຍງານແລ້ວ, ເຈົ້າສາມາດເປີດໃຊ້ gating ສຳລັບສະເພາະແຜນທີ່ເລືອກໄດ້. ຊື່ແຜນຈະກາຍເປັນສ່ວນໜຶ່ງຂອງຊື່ resultsdb testcase ເຊິ່ງຖືກໃຊ້ໃນການກຳນົດຄ່າ gating.yaml. ເບິ່ງລາຍລະອຽດໃນເອກະສານ gating ສ່ວນ Using Multiple Plans.

ເສັ້ນທາງທີ່ສັ້ນທີ່ສຸດ (Minimal Path)

ນີ້ຄືຕົວຢ່າງຂອງຂັ້ນຕອນການສ້າງການທົດສອບແບບສັ້ນທີ່ສຸດ:

dnf install -y tmt+all
git clone https://src.fedoraproject.org/rpms/bash
cd bash
tmt init -t mini
vim plans/example.fmf
tmt run

ຕົວຢ່າງທີ່ຂະຫຍາຍເພີ່ມເຕີມ ໂດຍໃຊ້ test ແລະ plan template ທີ່ກຳນົດເອງ ແລະ ສັ່ງທົດສອບໂດຍກົງບົນ local host:

dnf install -y tmt+all
git clone https://src.fedoraproject.org/rpms/bash
cd bash
tmt init
tmt plan create --template base plans/smoke
tmt test create --template beakerlib tests/smoke
vim plans/smoke.fmf tests/smoke/*
tmt run --all provision -h local
git add .
git commit -m "Enable basic tests"
git push

ເຄັດລັບກ່ຽວກັບ Virtualization

ເພື່ອດຳເນີນການທົດສອບຢ່າງປອດໄພພາຍໃຕ້ເຄື່ອງຈຳລອງທີ່ເປີດໃຊ້ໃນແລັບທັອບຂອງເຈົ້າ, ເຈົ້າພຽງແຕ່ຕິດຕັ້ງແພັກເກັດ tmt+provision-virtual. ໂດຍປົກກະຕິແລ້ວ ມັນຈະໃຊ້ session connection ດັ່ງນັ້ນຈຶ່ງບໍ່ຈຳເປັນຕ້ອງມີຂັ້ນຕອນອື່ນ, ພຽງແຕ່ສັ່ງທົດສອບດ້ວຍຄຳສັ່ງ tmt run. ເບິ່ງຕົວເລືອກເພີ່ມເຕີມໃນ Virtualization Tips.

ຂໍ້ມູນເພີ່ມເຕີມ

ຕົວຢ່າງການທົດສອບ

ຕົວຢ່າງໂຄງການທີ່ມີການທົດສອບດ້ວຍ tmt:

ເບິ່ງໜ້າ examples ຂອງ tmt ສຳລັບແຮງບັນດານໃຈເພີ່ມເຕີມ.

ຄຳຖາມ

ເຄື່ອງມືນີ້ເຂົ້າມາແທນທີ່ ຫຼື ຍົກເລີກການໃຊ້ STI ບໍ່?

ບໍ່, ໃນປັດຈຸບັນຍັງບໍ່ມີແຜນທີ່ຈະຍົກເລີກ STI. ທັງ tmt ແລະ sti ເຊິ່ງເປັນວິທີການກຳນົດຄ່າ CI ແມ່ນສາມາດໃຊ້ຄວບຄູ່ກັນໄປໄດ້.

ການທົດສອບເຫຼົ່ານີ້ຮອງຮັບໃນ Fedora CI ບໍ່?

ຮອງຮັບ, Fedora CI ແມ່ນຮອງຮັບທຸກສາຂາ (branches) ທີ່ຍັງເຄື່ອນໄຫວຢູ່ ແລະ ລວມເຖິງ tests namespace ເຊັ່ນກັນ.

ເຄື່ອງມືນີ້ຮອງຮັບ Linux distributions ໃດແດ່?

ສຳລັບລະບົບທີ່ໃຊ້ທົດສອບ (system under test), ສາມາດໃຊ້ Fedora ທຸກເວີຊັນທີ່ຍັງຮອງຮັບ, Centos 6+ ແລະ Red Hat Enterprise Linux 6+ ຂຶ້ນໄປ. ສຳລັບເຄື່ອງທີ່ໃຊ້ສັ່ງການ (test runner), ຈຳເປັນຕ້ອງໃຊ້ Fedora ທຸກເວີຊັນທີ່ຍັງຮອງຮັບ, Centos 8+ ຫຼື Red Hat Enterprise Linux 8+ ຂຶ້ນໄປ.