don't stop believing

unittest 결과를 html report로 뽑아봅시다. (HtmlTestRunner) 본문

Python/unittest

unittest 결과를 html report로 뽑아봅시다. (HtmlTestRunner)

Tongchun 2018. 11. 30. 10:27

테스트할때 Python unittest를 가장 많이 사용합니다.

테스트를 끝내고 결과로 공유할 만한 html 형식의 Report가 있었으면 좋다고 생각했었는데요. 

그래서 찾다 gauge를 사용하기도 했습니다.

Gauge에 대해도 아래 링크처럼 글을 몇개 올린것도 있는데요. 이때도 Gauge를 사용하게 된 이유는 시나리오 작성의 이점 보다는 html로 뽑아지는 Report였습니다.

http://dejavuqa.tistory.com/category/Testing%20Automation/Gauge

https://gauge.org/


Gauge의 Report와 비교해 기능과 보여지는 화면의 기능은 좀 적지만 unittest와 함께 사용할만한 open source로 올라온 source가 있어 소개합니다.


HtmlTestRunner

https://github.com/oldani/HtmlTestRunner


설치는 pip으로 합니다.

$ pip install html-testRunner

이제 간단한 unittest code를 작성해 봅니다.

reportTest.py라고 파일을 만들고 아래와 같이 작성했습니다.

import HtmlTestRunner
import unittest


class TestStringMethods(unittest.TestCase):
    """ Example test for HtmlRunner. """

    def test_upper(self):
        self.assertEqual('foo'.upper(), 'FOO')

    def test_isupper(self):
        self.assertTrue('FOO'.isupper())
        self.assertFalse('Foo'.isupper())

    def test_split(self):
        s = 'hello world'
        self.assertEqual(s.split(), ['hello', 'world'])
        # check that s.split fails when the separator is not a string
        with self.assertRaises(TypeError):
            s.split(2)

    def test_error(self):
        """ This test should be marked as error one. """
        raise ValueError

    def test_fail(self):
        """ This test should fail. """
        self.assertEqual(1, 2)

    @unittest.skip("This is a skipped test.")
    def test_skip(self):
        """ This test should be skipped. """
        pass

if __name__ == '__main__':
    reportFoler = "ReportTest"
    unittest.main(testRunner=HtmlTestRunner.HTMLTestRunner(output=reportFoler))

pip으로 설치한 HtmlTestRunner 모듈을 import했구요. 아래로 unittest assert 함수들을 사용해 테스트 케이스를 만들었습니다.


unittest를 실행하는 unittest.main()에 testRunner를 지정해 줍니다.

if __name__ == '__main__':

    reportFoler = "ReportTest"

    unittest.main(testRunner=HtmlTestRunner.HTMLTestRunner(output=reportFoler))


이때 Report가 생성될 폴더를 지정해 줍니다. 

작성한 reportTest.py를 실행하면 testcase에 맞게 assert message들이 나오게 됩니다.

$ python reportTest.py 

Running tests... 
----------------------------------------------------------------------
 This test should be marked as error one. ... ERROR (0.000372)s
 This test should fail. ... FAIL (0.000164)s
 test_isupper (__main__.TestStringMethods) ... OK (0.000047)s
 This test should be skipped. ... SKIP (0.000023)s
 test_split (__main__.TestStringMethods) ... OK (0.000116)s
 test_upper (__main__.TestStringMethods) ... OK (0.000050)s

======================================================================
ERROR [0.000372s]: This test should be marked as error one.
----------------------------------------------------------------------
Traceback (most recent call last):
  File "reportTest.py", line 24, in test_error
    raise ValueError
ValueError

======================================================================
FAIL [0.000164s]: This test should fail.
----------------------------------------------------------------------
Traceback (most recent call last):
  File "reportTest.py", line 28, in test_fail
    self.assertEqual(1, 2)
AssertionError: 1 != 2

----------------------------------------------------------------------
Ran 6 tests in 0:00:00

FAILED
 (Failures=1, Errors=1, Skipped=1)

Generating HTML reports... 

테스트가 완료되면 Generating HTML reports ... 라고 메시지가 나옵니다.

지정한 폴더에 report가 생성되었는지 tree로 확인해 보면 아래와 같습니다.

$ tree
.
├── reportTest.py
└── reports
    └── ReportTest
        └── Test_TestStringMethods_2018-11-30_09-59-29.html

2 directories, 2 files

기본적으로 reports라는 폴더가 python 스크립트 파일과 동이한 위치에 생성됩니다.

reports 폴더 하위에 지정한 폴더인 ReportTest 폴더가 생성되고 그 안에 html Report가 있습니다.

html report의 이름은 class 이름과 날짜, 시간으로 되어 있네요.


Test_TestStringMethods_2018-11-30_09-59-29.html 파일을 열어 봅니다

정상적인 testcase를 제외한 Fail, Error, Skip 에는 Assert Message가 보이네요.


testcase가 많아지거나 testcase 실행을 구분해야 할 경우 TestSuite를 사용하게 됩니다.

TestSuite를 사용할 경우 아래와 같이 사용할 수 있습니다.

from unittest import TestLoader, TestSuite
from HtmlTestRunner import HTMLTestRunner

from reportTest01 import TestString01
from reportTest02 import TestString02


example1_tests = TestLoader().loadTestsFromTestCase(TestString01)
example2_tests = TestLoader().loadTestsFromTestCase(TestString02)

suite = TestSuite([example1_tests, example2_tests])

runner = HTMLTestRunner(output='suiteTest')

runner.run(suite)

Terminal 화면에서 보고 넘기는 것 보다 이쁘게 report가 되니 좋네요.


'Python > unittest' 카테고리의 다른 글

unittest assert 함수 살펴보기  (0) 2018.03.27
Python Unittest 살펴보기  (0) 2017.11.06
Comments