在pycharm中運行robotframework用例,並實時打印日誌

1、安裝插件
打開 File-Settings彈窗,選擇Plugins,搜索插件Robot Framework Support並安裝
在這裏插入圖片描述
2、設置文件類型
使用默認的robot其實就可以,如果想要txt類型,也可以在此添加
在這裏插入圖片描述
3、設置External Tools
Program設置本機的python安裝路徑robot.exe文件
Working directory 設置爲FileDirFileDir
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

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章