はじめに
robotframeworkからpythonを呼び出そうとした時にエラーが発生しました。
pythonは自作の関数で、ログをrobotframeworkに出力しようとした時に失敗したからでした。
今回はその時のエラーの原因と対処方法についてです。
エラー
ソースはソケットを使う簡単なテストのソースコードでです。
robotframeworkからpythonのsocketライブラリを呼び出して使うようにしていたのですが、出力結果をrobotframework上のコンソールに出したくてloggerを使っていた時に発生。
ソースコードは次のようなものです(簡略化しています)
こちらはrobotframeworkのコード。
# call_socket.robot
*** Settings ***
Library socket_test.py
*** Variables ***
${IP_ADD} 127\.0\.0\.1
*** Keywords ***
*** Test Cases ***
Test
${return_wd}= py_socket ${IP_ADD} 4000
Log To Console ${\n}${return_wd}
こちらがpythonのコードです。
import socket
from robot.api import logger
def py_socket(ip_addr, port_num):
s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
param = (ip_addr, int(port_num))
s.connect(param)
print(ip_addr, 'Port:', str(port_num), 'へ接続中')
logger.console(ip_addr, 'Port:', str(port_num), 'へ接続中')
s.send(b'test')
result = int(s.recv(256).decode().rstrip('\n'))
return result
エラーメッセージは
TypeError: console() takes from 1 to 3 positional arguments but 4 were given
というものです。
エラーを訳すと
「型によるエラー:console()は1〜3つの引数を取りますが実際4つ渡されています」
とあります。
原因
原因はpythonのコード10行目の
logger.console(ip_addr, ‘Port:’, str(port_num), ‘へ接続中’)
の部分です。
pythonのprint()の場合、9行目のようにカンマ区切りで文字列をつなげることが可能です。
(print()は「+」で連結も可能)
ですが、loggerの場合は文字の連結はカンマ区切りでは利用できません。
loggerで文字列を結合する場合「+」で連結する必要があります。
次が修正したソースコードです。
import socket
from robot.api import logger
def py_socket(ip_addr, port_num):
s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
param = (ip_addr, int(port_num))
s.connect(param)
print(ip_addr, 'Port:', str(port_num), 'へ接続中')
logger.console(str(ip_addr)+ "Port:" + str(port_num) + "へ接続中")
s.send(b'test')
result = int(s.recv(256).decode().rstrip('\n'))
return hantei
intの箇所はstr()でキャストして文字列に変換しています。
さいごに
今回はrobotframeworkとpythonを利用した際にログ表示部分のミスによるエラーでした。
pythonの外部ライブラリを呼び出して使えるのがrobotframeworkの良い点です。
外部結果をrobotframeworkに表示したい事も多く、loggerは頻繁に利用すると思います。
robotframeworkの文法はかなりpythonライクじゃないのでpythonの書き方をするとこの様にエラーになることもよくありますので注意が必要ですね。
この記事がお役に立ったのなら嬉しいです。
最後までお読みいただきありがとうございます。