Robot Framework 테스트 라이브러리 API 완벽 가이드

테스트 라이브러리 문서화

유지보수를 용이하게 하려면 테스트 라이브러리 문서는 소스 코드에서 자동으로 생성되어야 합니다. Robot Framework는 libdoc.py라는 자체 문서화 도구를 제공하여 API 문서를 생성합니다.

키워드 문서의 첫 번째 줄은 일반적으로 해당 키워드의 간략한 개요를 포함해야 합니다. 이 내용은 libdoc.py에 의해 키워드의 툴팁으로 사용되며, 테스트 로그에도 표시됩니다.

사용 예시:

python -m robot.libdoc LibraryExampleD LibraryExampleD.html

테스트 라이브러리 테스트 방법

두 가지 주요 접근 방식이 있습니다:

  • 단위 테스트: Python의 unittest와 같은 도구를 사용하여 테스트 라이브러리의 각 함수를 개별적으로 검증합니다.
  • 인수 테스트: Robot Framework 자체를 사용하여 라이브러리를 테스트합니다. BuiltIn 라이브러리의 Run Keyword And Expect Error 키워드는 키워드가 예상대로 오류를 발생시키는지 확인하는 데 특히 유용합니다.

두 방법 중 선택은 특정 상황에 따라 달라집니다.

테스트 라이브러리 패키징

단일 파일로 구성된 간단한 라이브러리는 사용자가 직접 복사하여 라이브러리 검색 경로에 추가할 수 있습니다. 그러나 복잡한 라이브러리는 패키징하여 설치를 간소화하는 것이 좋습니다. Python에서는 표준 라이브러리의 distutils 또는 최신 setuptools를 사용할 수 있습니다. 패키징의 주요 이점은 라이브러리가 자동으로 검색 경로에 설치된다는 점입니다.

사용 중단(deprecated) 키워드

키워드 문서의 시작 부분에 *DEPRECATED*를 추가하면 해당 키워드는 사용 중단으로 표시됩니다. 이러한 키워드가 실행되면 콘솔과 별도의 테스트 로그 파일에 경고 메시지가 출력됩니다.

예제 코드 (LibraryExampleD.py):

# -*- coding: utf-8 -*-
class LibraryExampleD():
    """문서화가 포함된 예제 라이브러리입니다."""
    
    def keyword_with_short_documentation(self, argument):
        """이 키워드는 짧은 문서만 가지고 있습니다."""
        pass
        
    def keyword_with_longer_documentation(self):
        """첫 번째 줄은 여기에 있습니다.
        
        긴 문서는 계속되며 여러 줄이나 단락을 포함할 수 있습니다.
        """
        pass
        
    def example_keyword(argument):
        """*DEPRECATED* 'Other Keyword' 키워드를 대신 사용하세요.
        
        이 키워드는 주어진 'argument'에 대해 작업을 수행하고 결과를 반환합니다.
        """

Robot Framework 테스트 라이브러리 API 종류

Robot Framework는 세 가지 종류의 테스트 라이브러리 API를 제공합니다:

정적(Static) API

가장 간단한 방법입니다. Python 모듈이나 클래스를 사용하여 키워드를 직접 제공합니다. 메서드 이름과 키워드가 일치하며, 메서드는 동일한 매개변수를 가집니다. 키워드는 예외를 알리고, 로그를 출력하며, 필요한 값을 반환할 수 있습니다.

동적(Dynamic) API

동적 API를 사용하는 클래스는 두 가지 메서드를 구현해야 합니다: 자신이 구현한 키워드 이름을 반환하는 메서드와 해당 키워드를 실행하는 메서드입니다. 키워드의 구체적인 구현과 실행은 런타임에 결정됩니다.

혼합(Hybrid) API

정적 API와 비교하여, 혼합 API를 사용하는 클래스는 구현된 키워드를 찾는 추가 메서드를 가집니다. 이러한 키워드는 직접 사용할 수 있습니다. 다른 모든 측면은 정적 API와 동일합니다.

동적 테스트 라이브러리 생성

동적 라이브러리는 정적 라이브러리와 키워드 구현, 매개변수 및 문서 구현, 그리고 키워드 실행 방식에서 차이가 있습니다. 모든 동적 라이브러리는 get_keyword_namesrun_keyword 메서드를 반드시 가져야 하며, 다른 메서드는 선택 사항입니다.

키워드 이름 가져오기

get_keyword_names 메서드는 구현된 키워드의 이름을 반환합니다. 이 메서드는 매개변수가 없으며, 문자열 리스트를 반환해야 합니다. 동적 라이브러리는 이 메서드를 반드시 가져야 합니다.

키워드 실행

run_keyword 메서드는 키워드를 실행합니다. 두 개의 매개변수를 받습니다:

  • 첫 번째: 실행할 키워드 이름 (get_keyword_names에서 반환된 형식과 동일)
  • 두 번째: 키워드에 전달할 인수 리스트

키워드 매개변수 가져오기

get_keyword_arguments 메서드는 키워드가 실제로 필요로 하는 매개변수를 Robot Framework에 알려줍니다. 키워드 이름을 매개변수로 받아 해당 키워드가 허용하는 매개변수 문자열 리스트를 반환합니다. 동적 키워드는 다양한 수의 매개변수, 기본값을 가진 매개변수, 가변 인자를 지원할 수 있습니다.

키워드 문서 가져오기

get_keyword_documentation 메서드는 키워드의 문서를 가져와 libdoc으로 생성된 라이브러리 문서에 포함시킵니다. 키워드 이름을 매개변수로 받아 문자열 형태로 문서를 반환합니다.

동적 API의 가장 좋은 예는 Robot Framework의 Remote 라이브러리입니다.

예제 코드 (LibraryExampleE.py):

# -*- coding: utf-8 -*-

class LibraryExampleE():
    
    def get_keyword_names(self):
        return ['first keyword', 'second keyword']
        
    def run_keyword(self, name, args):
        print "키워드 '%s'를 인수 %s로 실행 중입니다." % (name, args)
        
    def get_keyword_arguments(self, name):
        return ['*arguments']
        
    def get_keyword_documentation(self, name):
        return """일부 문서가 포함된 동적 라이브러리 예제입니다."""

혼합 테스트 라이브러리 생성

혼합 API 라이브러리는 정적 API와 동적 API의 중간 형태입니다. 일부 메서드는 직접 구현하고, 더 중요한 것은 동적으로 처리할 수 있습니다.

키워드 이름 가져오기

get_keyword_names 메서드를 사용하여 구현된 키워드 이름 리스트를 반환합니다. 동적 API와 유사합니다.

키워드 실행

정적 API와 유사하게 리플렉션(reflection)을 사용하여 키워드를 구현하는 메서드를 찾습니다.

키워드 매개변수 및 문서 가져오기

정적 API와 동일한 방식으로, 메서드 참조를 얻은 후 해당 참조에서 매개변수와 문서 정보를 검색합니다.

혼합 API의 주요 장점은 키워드의 매개변수와 문서를 얻기 위한 특별한 메서드가 필요하지 않다는 점입니다. 실제로 동적인 키워드는 __getattr__에서 처리하고, 나머지는 메인 라이브러리 클래스에서 직접 구현합니다. Python을 사용할 때 혼합 API가 대부분의 경우 더 좋은 선택입니다.

혼합 API의 좋은 예는 Robot Framework에 내장된 Telnet 라이브러리입니다.

예제 코드 (LibraryExampleF.py):

# -*- coding: utf-8 -*-
import LibraryExampleFlib

class LibraryExampleF():
    """문서화가 포함된 혼합 라이브러리 예제입니다."""
    
    def get_keyword_names(self):
        return ['my_keyword', 'external_keyword']
        
    def my_keyword(self, arg):
        print "'%s'로 My Keyword 호출됨" % arg
        
    def __getattr__(self, name):
        if name == 'external_keyword':
            return LibraryExampleFlib.hello
        raise AttributeError("존재하지 않는 속성 '%s'" % name)

# LibraryExampleFlib.py
def hello():
    print "Hello, world!"

def Nothing():
    pass

Robot Framework 내부 모듈 사용

Python으로 구현된 테스트 라이브러리는 Robot Framework의 내부 모듈을 사용할 수 있습니다. 단, 주의해서 사용해야 합니다. 모든 Robot Framework API가 외부에서 호출 가능한 것은 아니며, 버전 간에 API가 크게 변경될 수 있습니다.

가장 안전한 API는 BuiltIn 라이브러리의 키워드를 구현하는 메서드들입니다. 가장 유용한 방법 중 하나는 replace_variables로, 현재 사용 가능한 변수에 접근할 수 있습니다.

예제 코드 (LibraryExampleG.py):

# -*- coding: utf-8 -*-
import os.path
from robot.libraries.BuiltIn import BuiltIn

class LibraryExampleG():
    
    def do_something(argument):
        output = '많은 출력을 생성하는 작업(argument)'
        outputdir = BuiltIn().replace_variables('${OUTPUTDIR}')
        path = os.path.join(outputdir, 'results.txt')
        f = open(path, 'w')
        f.write(output)
        f.close()
        print '*HTML* 출력이 <a href="results.txt">results.txt</a>에 기록되었습니다'

기존 테스트 라이브러리 확장

기존 테스트 라이브러리에 새로운 기능을 추가하는 방법과 자신의 라이브러리에서 이를 사용하는 방법을 설명합니다.

원본 코드 수정

소스 코드를 직접 수정하는 방식은 혼란을 야기할 수 있고, 추가적인 재패키징이 필요합니다.

상속(Inheritance)

상속을 사용하여 기존 라이브러리를 확장합니다. 새 라이브러리는 원본과 다른 이름을 가지므로 사용자 정의 라이브러리를 쉽게 식별할 수 있습니다. 하지만 새 라이브러리가 원본과 동일한 키워드를 가지므로 충돌이 발생할 수 있습니다. 또한 테스트 라이브러리는 상태를 공유할 수 없습니다.

다른 테스트 라이브러리 직접 사용

메서드가 정적이고 라이브러리 상태에 의존하지 않는 경우, 해당 라이브러리를 임포트하여 메서드를 직접 사용할 수 있습니다.

Robot Framework에서 활성 테스트 라이브러리 인스턴스 가져오기

BuiltIn 키워드 Get Library Instance를 사용하면 Robot Framework 자체에서 현재 활성화된 라이브러리 인스턴스를 가져올 수 있습니다. 반환된 인스턴스는 현재 라이브러리 상태를 확인할 수 있습니다.

동적 또는 혼합 API를 사용하는 라이브러리 확장

동적 또는 혼합 API를 사용하는 라이브러리는 일반적으로 자체 확장 방식을 가지고 있습니다. 이러한 라이브러리에 대한 확장 방법은 라이브러리 개발자의 문서나 소스 코드를 참조해야 합니다.

태그: Robot Framework 테스트 라이브러리 api libdoc python

7월 25일 23:35에 게시됨