この記事は 「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.
と
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