Robot FrameworkのlintツールであるRobot Framework Lintを試してみた

この記事は 「Robot Framework Advent Calendar 2017 - Qiita」 の20日目の記事です。

Robot Frameworkのlintツール(ソースコード静的解析ツール)を探したところ、 Robot Framework Lint がありました。
boakley/robotframework-lint: Linter for robot framework plain text files

そこで今回は Robot Framework Lintを試してみました。

 
目次

 

環境

  • Python 3.6.3
  • Robot Framework 3.0.2
  • Robot Framework Lint 0.9

Robot Framework LintのインストールはpipでOKです。

pip install --upgrade robotframework-lint

 

Lintの実行

例えば、こんな感じのテストファイル test_selenium.robot があるとします。

*** Settings ***
Library  SeleniumLibrary

*** Variables ***
${browser}  chrome

*** Keywords ***
ブラウザを起動する
    Open Browser  https://google.co.jp  ${browser}

*** Test Cases ***
Seleniumをテストする
    ブラウザを起動する
    Close Browser

 
このファイルに対してlintを実行してみます。

$ rflint test_selenium.robot 
+ test_selenium.robot
W: 2, 0: No suite documentation (RequireSuiteDocumentation)
E: 13, 0: No testcase documentation (RequireTestDocumentation)
E: 9, 0: No keyword documentation (RequireKeywordDocumentation)
W: 8, 0: Too few steps (1) in keyword (TooFewKeywordSteps)

結果が出力されました。

Documentがなかったり、テストケースの中のステップが短すぎるようです。

 

デフォルトのlint内容

rflint --list コマンドにて、デフォルトのlint内容が確認できます。

$ rflint --list
E DuplicateKeywordNames
E DuplicateTestNames
W FileTooLong
W InvalidTable
W LineTooLong
W PeriodInSuiteName
W PeriodInTestName
E RequireKeywordDocumentation
W RequireSuiteDocumentation
E RequireTestDocumentation
E TagWithSpaces
W TooFewKeywordSteps
W TooFewTestSteps
W TooManyTestCases
W TooManyTestSteps
W TrailingBlankLines

 
それぞれの内容はソースコードを見て確認します。
https://github.com/boakley/robotframework-lint/tree/master/rflint/rules

 

lintの範囲

lintの範囲を確かめるため、

  • 一つのファイル内でキーワードが重複するケース
  • 複数のファイル間でキーワードが重複するケース

を試してみます。

 
test_duplicate_in_onefile.robot

*** Settings ***
Documentation  一つのファイルで重複したテストケースを含むテスト

*** Test Cases ***
一つのファイルでテストケース名が重複
    Log To Console  foo

一つのファイルでテストケース名が重複
    Log To Console  bar

 

  • test_duplicate_in_multi_file1.robot
  • test_duplicate_in_multi_file2.robot
*** Settings ***
Documentation  複数のファイルで重複したテストケースを含むテスト

*** Test Cases ***
複数のファイルでテストケース名が重複
    Log To Console  foo

 
rflintを実行します。

$ rflint .
+ ./test_duplicate_in_multi_file1.robot
E: 6, 0: No testcase documentation (RequireTestDocumentation)
W: 5, 0: Too few steps (1) in test case (TooFewTestSteps)
+ ./test_duplicate_in_multi_file2.robot
E: 6, 0: No testcase documentation (RequireTestDocumentation)
W: 5, 0: Too few steps (1) in test case (TooFewTestSteps)
+ ./test_duplicate_in_onefile.robot
E: 8, 0: Duplicate testcase name '一つのファイルでテストケース名が重複' (DuplicateTestNames)
E: 6, 0: No testcase documentation (RequireTestDocumentation)
W: 5, 0: Too few steps (1) in test case (TooFewTestSteps)
E: 9, 0: No testcase documentation (RequireTestDocumentation)
W: 8, 0: Too few steps (1) in test case (TooFewTestSteps)

これよりlintの範囲はテストケースファイルのようです。

 

カスタムルールを作成する

Wikiによると、カスタムルールを作成できるようです。
How to write custom rules · boakley/robotframework-lint Wiki

 

カスタムルールファイルのディレクトリを確認する

カスタムルールファイルをどこに置けばよいのか確認したところ、

At the moment, rflint will only look for rules in the rules folder where rflint is installed.

Home · boakley/robotframework-lint Wiki

Custom rules should be put in the site-rules folder. The only difference between these classes is how and when they are called.

How to write custom rules · boakley/robotframework-lint Wiki

とありました。

robotframework-lint がインストールされているディレクトリの中にある rules の中に site-rules を追加すれば良さそうでした。

ディレクトリを確認すると、

$ pwd
/path/to/rfenv363/lib/python3.6/site-packages

$ tree rflint
rflint
├── __init__.py
...
├── rules
│   ├── keywordRules.py
│   ├── otherRules.py
│   ├── suiteRules.py
│   └── testcaseRules.py
...

のようです。

ただ、ディレクトリが深いので他の方法がないかを探したところ、コマンドラインオプションで指定できるようでした。

$ rflint --help
usage: python -m rflint [-h] [--error RULENAME] [--ignore RULENAME]
                        [--warning RULENAME] [--list] [--describe]
                        [--no-filenames] [--format FORMAT] [--version]
                        [--verbose] [--configure CONFIGURE] [--recursive]
                        [--rulefile RULEFILE] [--argumentfile ARGUMENTFILE]
                        ...

A style checker for robot framework plain text files.

positional arguments:
  file

optional arguments:
...
  --rulefile RULEFILE, -R RULEFILE
                        import additional rules from the given RULEFILE

なお、ディレクトリは指定できないようです。

$ rflint --rulefile rflint/rules/ .
rflint: rflint/rules/: exception while loading: [Errno 21] Is a directory: 'rflint/rules/'

 
今回はお手軽にするため、コマンドラインオプションでカスタムルールファイルを指定することとします。

 

カスタムルールファイルを作成する

Pyhonにてカスタムルールファイルを作成します。

ルールとして作成できるのは、

  • SuiteRule
  • ResourceRule
  • TestRule
  • KeywordRule
  • GeneralRule

があるようです。
How to write custom rules · boakley/robotframework-lint Wiki

 
今回は「3文字未満のキーワードはエラーとする」というカスタムキーワードルールを作成します。

# 継承元のKeywordRule、およびlintで出力するレベルをimport
from rflint.common import KeywordRule, ERROR


# KeywordRuleを継承したクラスを定義
class TooShortKeywordRule(KeywordRule):
    # クラス変数 severity に、出力レベルを指定
    severity = ERROR

    # apply()メソッドに、実際のチェック内容を指定
    def apply(self, keyword):
        # チェックエラーとする条件
        if len(keyword.name) < 3:
            # reportメソッドを使って、lintエラーになった時の内容を出力する
            # 第一引数は該当したオブジェクト、第二引数はメッセージ、第三引数は該当行
            self.report(keyword, f'too short keyword name: {keyword.name}', keyword.linenumber)

 
なお、KeywordRuleで参照できる属性は以下に書かれています。
The Keyword class · boakley/robotframework-lint Wiki

他のルールも、同様のページがWikiに用意されています。

 

lint対象のファイル

今回は以下のファイルをlint対象にします。

test_error_keyword_rule.robot

*** Settings ***
Documentation  カスタムキーワードルール違反


*** Keywords ***
ふー
    Log To Console  baz

ふーー
    Log To Console  hoo

*** Test Cases ***
一つのファイルでテストケース名が重複
    ふー

 

カスタムルールを追加したlintの実行

test_error_keyword_rule.robot ファイルに対してlintを実行してみます。

$ rflint --rulefile custom_rule/keyword_rule.py test_error_keyword_rule.robot 
+ test_error_keyword_rule.robot
E: 14, 0: No testcase documentation (RequireTestDocumentation)
W: 13, 0: Too few steps (1) in test case (TooFewTestSteps)
E: 7, 0: No keyword documentation (RequireKeywordDocumentation)
W: 6, 0: Too few steps (1) in keyword (TooFewKeywordSteps)
E: 6, 0: too short keyword name: ふー (TooShortKeywordRule)
E: 10, 0: No keyword documentation (RequireKeywordDocumentation)
W: 9, 0: Too few steps (1) in keyword (TooFewKeywordSteps)

E: 6, 0: too short keyword name: ふー (TooShortKeywordRule) が出力されています。

一方、 ふーー というキーワードは3文字なのでlintエラーの対象外となりました。

 

ソースコード

GitHubに上げました。 rflint_sample ディレクリの中が今回のものです。
thinkAmi-sandbox/RobotFramework-sample: Robot Framewrok samples