1、安裝插件
打開 File-Settings彈窗,選擇Plugins,搜索插件Robot Framework Support並安裝
2、設置文件類型
使用默認的robot其實就可以,如果想要txt類型,也可以在此添加
3、設置External Tools
Program設置本機的python安裝路徑robot.exe文件
Working directory 設置爲
Arguments:
運行單條case :
-d results -t "$SelectedText$" ./
運行整個suite文件夾 :
-d results $FileName$
4、運行用例
運行整個suite只需要點擊右鍵,External Tools 即可
運行單條用例需要選中用例的名字,然後運行
5、修改報告文件地址
用上面的設置雖然也能運行腳本,但是會生成很多results文件
最好是設置一個固定的results地址,比如D盤根目錄。這樣所有用例運行結果都存放在這裏。
-d D:\results -t "$SelectedText$" ./
添加監聽器打印運行日誌
在ride中運行腳本會打印實時日誌,但是pycharm運行就需要自己動手添加打印日誌的功能。
1、首先查看ride中的運行命令,打印日誌是在listener的功勞。
文件目錄:C:\Users\86182\AppData\Local\Programs\Python\Python37\lib\site-packages\robotide\contrib\testrunner\TestRunnerAgent.py
2、找到監聽器代碼
class TestRunnerAgent:
"""Pass all listener events to a remote listener
If called with one argument, that argument is a port
If called with two, the first is a hostname, the second is a port
"""
ROBOT_LISTENER_API_VERSION = 2
def __init__(self, *args):
self.port = int(args[0])
self.host = HOST
self.sock = None
self.filehandler = None
self.streamhandler = None
self._connect()
self._send_pid()
self._create_debugger((len(args) >= 2) and (args[1] == 'True'))
self._create_kill_server()
print("TestRunnerAgent: Running under %s %s\n" %
(PLATFORM, sys.version.split()[0]))
def _create_debugger(self, pause_on_failure):
self._debugger = RobotDebugger(pause_on_failure)
def _create_kill_server(self):
self._killer = RobotKillerServer(self._debugger)
self._server_thread = threading.Thread(
target=self._killer.serve_forever)
self._server_thread.setDaemon(True)
self._server_thread.start()
self._send_server_port(self._killer.server_address[1])
def _send_pid(self):
self._send_socket("pid", os.getpid())
def _send_server_port(self, port):
self._send_socket("port", port)
def start_test(self, name, attrs):
self._send_socket("start_test", name, attrs)
def end_test(self, name, attrs):
self._send_socket("end_test", name, attrs)
def start_suite(self, name, attrs):
attrs_copy = copy.copy(attrs)
del attrs_copy['doc']
attrs_copy['is_dir'] = os.path.isdir(attrs['source'])
self._send_socket("start_suite", name, attrs_copy)
def end_suite(self, name, attrs):
attrs_copy = copy.copy(attrs)
del attrs_copy['doc']
attrs_copy['is_dir'] = os.path.isdir(attrs['source'])
self._send_socket("end_suite", name, attrs_copy)
def start_keyword(self, name, attrs):
# pass empty args, see https://github.com/nokia/RED/issues/32
# we're cutting args from original attrs dict, because it may contain
# objects which are not json-serializable and we don't need them anyway
attrs_copy = copy.copy(attrs)
del attrs_copy['args']
del attrs_copy['doc']
del attrs_copy['assign']
self._send_socket("start_keyword", name, attrs_copy)
if self._debugger.is_breakpoint(name, attrs): # must check original
self._debugger.pause()
paused = self._debugger.is_paused()
if paused:
self._send_socket('paused')
self._debugger.start_keyword()
if paused:
self._send_socket('continue')
def end_keyword(self, name, attrs):
# pass empty args, see https://github.com/nokia/RED/issues/32
attrs_copy = copy.copy(attrs)
del attrs_copy['args']
del attrs_copy['doc']
del attrs_copy['assign']
self._send_socket("end_keyword", name, attrs_copy)
self._debugger.end_keyword(attrs['status'] == 'PASS')
def message(self, message):
pass
def log_message(self, message):
if _is_logged(message['level']):
self._send_socket("log_message", message)
def log_file(self, path):
self._send_socket("log_file", path)
def output_file(self, path):
pass
def report_file(self, path):
self._send_socket("report_file", path)
def summary_file(self, path):
pass
def debug_file(self, path):
pass
def close(self):
self._send_socket("close")
if self.sock:
self.filehandler.close()
self.sock.close()
def _connect(self):
"""Establish a connection for sending data"""
try:
self.sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
self.sock.connect((self.host, self.port))
# Iron python does not return right object type if not binary mode
self.filehandler = self.sock.makefile('wb')
self.streamhandler = StreamHandler(self.filehandler)
except socket.error as e:
print('unable to open socket to "%s:%s" error: %s'
% (self.host, self.port, str(e)))
self.sock = None
self.filehandler = None
def _send_socket(self, name, *args):
try:
if self.filehandler:
packet = (name, args)
self.streamhandler.dump(packet)
self.filehandler.flush()
except Exception:
import traceback
traceback.print_exc(file=sys.stdout)
sys.stdout.flush()
raise
3、反正那一堆的socket連接也看不懂,乾脆就把內容打印出來瞧瞧
自己寫的一個簡陋的監聽器
ROBOT_LISTENER_API_VERSION = 2
def log_message(message):
print(message)
def start_test(name, args):
print(name)
print(args)
4、使用監聽器運行腳本,查看輸出信息
C:\Users\86182\PycharmProjects\tracyTest>robot.exe --listener common\listener.py -t fakkk suite1/stuFaker.robot
==============================================================================
stuFaker
==============================================================================
fakkk fakkk
{'id': 's1-t1', 'longname': 'stuFaker.fakkk', 'doc': '', 'tags': [], 'starttime': '20200323 20:46:36.088', 'critical': 'yes', 'template': ''}
{'timestamp': '20200323 20:46:36.090', 'message': '${test1} = 李琳', 'level': 'INFO', 'html': 'no'}
.{'timestamp': '20200323 20:46:36.091', 'message': '${test2} = 鄧', 'level': 'INFO', 'html': 'no'}
.{'timestamp': '20200323 20:46:36.092', 'message': '${test2} = 532300195612268441', 'level': 'INFO', 'html': 'no'}
.{'timestamp': '20200323 20:46:36.093', 'message': '${test1} = 危地馬拉', 'level': 'INFO', 'html': 'no'}
.{'timestamp': '20200323 20:46:36.094', 'message': '${test1} = 四川省', 'level': 'INFO', 'html': 'no'}
.{'timestamp': '20200323 20:46:36.095', 'message': '${test1} = 通遼', 'level': 'INFO', 'html': 'no'}
.{'timestamp': '20200323 20:46:36.095', 'message': '${test1} = 陝西省香港縣懷柔六安路i座 556421', 'level': 'INFO', 'html': 'no'}
.{'timestamp': '20200323 20:46:36.096', 'message': '${fakeLongitude} = 109.004029', 'level': 'INFO', 'html': 'no'}
.{'timestamp': '20200323 20:46:36.097', 'message': '${fakeLatitude} = 0.650477', 'level': 'INFO', 'html': 'no'}
fakkk .{'timestamp': '20200323 20:46:36.098', 'message': '${test1} = 791681', 'level': 'INFO', 'html': 'no'}
.{'timestamp': '20200323 20:46:36.099', 'message': '${test1} = 飛海科技科技有限公司', 'level': 'INFO', 'html': 'no'}
.{'timestamp': '20200323 20:46:36.099', 'message': '${test1} = 科技有限公司', 'level': 'INFO', 'html': 'no'}
.{'timestamp': '20200323 20:46:36.100', 'message': '${test1} = [email protected]', 'level': 'INFO', 'html': 'no'}
.{'timestamp': '20200323 20:46:36.101', 'message': '${test1} = https://www.lorempixel.com/875/949', 'level': 'INFO', 'html': 'no'}
.{'timestamp': '20200323 20:46:36.114', 'message': '${test1} = 23.244.94.27', 'level': 'INFO', 'html': 'no'}
.{'timestamp': '20200323 20:46:36.115', 'message': '${test1} = 2001', 'level': 'INFO', 'html': 'no'}
.{'timestamp': '20200323 20:46:36.116', 'message': '${test1} = 美國國際一切認爲.', 'level': 'INFO', 'html': 'no'}
fakkk | PASS |
------------------------------------------------------------------------------
stuFaker | PASS |
1 critical test, 1 passed, 0 failed
1 test total, 1 passed, 0 failed
==============================================================================
Output: C:\Users\86182\PycharmProjects\tracyTest\output.xml
Log: C:\Users\86182\PycharmProjects\tracyTest\log.html
Report: C:\Users\86182\PycharmProjects\tracyTest\report.html
5、挨着嘗試,然後挑選自己需要的字段,按照自己喜歡的格式打印出來
ROBOT_LISTENER_API_VERSION = 2
def log_message(message):
print(message['timestamp'] + " : " + message['level'] + " : " + message['message'])
def start_suite(name, args):
print("開始運行測試集 : " + name + " " + args['source'])
def start_test(name, args):
print("開始執行測試用例 : " + name)
if args['template']:
print('Template is : ' + args['template'])
def end_test(name, args):
print("測試內容: " + args['longname'])
print("測試結果 : " + args['status'])
print("測試時間(秒): " + str(args['elapsedtime']))
執行結果如下:
C:\Users\86182\PycharmProjects\tracyTest>robot.exe --listener common\listener.py -t fakkk suite1/stuFaker.robot
==============================================================================
stuFaker
==============================================================================
開始運行測試集 : stuFaker C:\Users\86182\PycharmProjects\tracyTest\suite1\stuFaker.robot
fakkk 開始執行測試用例 : fakkk
20200323 20:51:25.213 : INFO : ${test1} = 郜婷
.20200323 20:51:25.214 : INFO : ${test2} = 陳
.20200323 20:51:25.215 : INFO : ${test2} = 340500200106241091
.20200323 20:51:25.215 : INFO : ${test1} = 英國
.20200323 20:51:25.216 : INFO : ${test1} = 吉林省
.20200323 20:51:25.217 : INFO : ${test1} = 合肥
.20200323 20:51:25.218 : INFO : ${test1} = 浙江省倩市長壽海門路w座 677532
.20200323 20:51:25.219 : INFO : ${fakeLongitude} = 113.654436
.20200323 20:51:25.219 : INFO : ${fakeLatitude} = -70.9840745
fakkk .20200323 20:51:25.220 : INFO : ${test1} = 511658
.20200323 20:51:25.221 : INFO : ${test1} = 黃石金承信息有限公司
.20200323 20:51:25.221 : INFO : ${test1} = 傳媒有限公司
.20200323 20:51:25.222 : INFO : ${test1} = [email protected]
.20200323 20:51:25.223 : INFO : ${test1} = https://www.lorempixel.com/965/882
.20200323 20:51:25.236 : INFO : ${test1} = 110.130.61.90
.20200323 20:51:25.237 : INFO : ${test1} = 2001
.20200323 20:51:25.238 : INFO : ${test1} = 美國點擊覺得影響自己.
fakkk .測試內容: stuFaker.fakkk
測試結果 : PASS
測試時間(秒): 27
fakkk | PASS |
------------------------------------------------------------------------------
stuFaker | PASS |
1 critical test, 1 passed, 0 failed
1 test total, 1 passed, 0 failed
==============================================================================
Output: C:\Users\86182\PycharmProjects\tracyTest\output.xml
Log: C:\Users\86182\PycharmProjects\tracyTest\log.html
Report: C:\Users\86182\PycharmProjects\tracyTest\report.html