這篇文章之所以會給整理出來,是因為學了一個季度的RF后,再去看官網的這個文檔,感觸破多,最大的感觸還是覺得自己走了不少彎路,還有些是學習方法上的彎路。在未查看這類官網文檔之前,更多的是看其他各種人的博客,看齊濤的修煉寶典(無任何惡意,僅表明適合剛入門的測試人員)的方式來學習RF,學的很多知識點都零散且不同的博客對同一個問題還有不同的個人看法。於是后期便開始查看官網文檔,學習了Quick Start Guide 文檔后,對於一個已入門3個月的測試來說,還是有些收獲(可能以前也是自己學的膚淺,呵呵)。下面就從Quick Start Guide中挑選出部分重要的知識點。
首先在官網下載Quick Start Guide的相關文檔(官網:https://github.com/robotframework/QuickStartGuide/blob/master/QuickStart.rst),這個文檔使用了一個經典的登錄應用程序,實際上就一個用python語言寫的基於命令的代碼。分2個模塊:一個模塊是服務器端的代碼login.py.里面主要有2個類構成UserDataBase和User,User類主要是針對User的屬性username,password,status的校驗管理。比如密碼長度必須是6-12位且由大小寫+數字組成。而UserDataBase主要是完成User與數據庫(robotframework-quickstart-db.txt)的交互。比如把符合一定規則的用戶注冊信息保存在數據庫中。部分代碼如下所示,詳細的代碼參見:QuickStartGuide-master\sut\login.py
class User(object): @property def password(self): return self._password @password.setter def password(self, password): self._validate_password(password) self._password = password def _validate_password(self, password): if not (7 <= len(password) <= 12): raise ValueError('Password must be 7-12 characters long') if not self._validate_password_chars(password): raise ValueError('Password must be a combination of lowercase ' 'and uppercase letters and numbers') def _validate_password_chars(self, password): has_lower = has_upper = has_number = False for char in password: if char.islower(): has_lower = True elif char.isupper(): has_upper = True elif char.isdigit(): has_number = True else: return False return has_lower and has_upper and has_number
class UserDataBase(object): def create_user(self, username, password): try: user = User(username, password) except ValueError as err: return 'Creating user failed: %s' % err self.users[user.username] = user return 'SUCCESS' def login(self, username, password): if self._is_valid_user(username, password): self.users[username].status = 'Active' return 'Logged In' return 'Access Denied' def _is_valid_user(self, username, password): return (username in self.users and self.users[username].password == password) def change_password(self, username, old_pwd, new_pwd): try: if not self._is_valid_user(username, old_pwd): raise ValueError('Access Denied') self.users[username].password = new_pwd except ValueError as err: return 'Changing password failed: %s' % err else: return 'SUCCESS'
還有一個模塊,是封裝關鍵字給RF直接調用的,然后在文件里面又調用了服務器模塊login.py來與服務進行交互。部分代碼如下,詳細代碼見:QuickStartGuide-master\lib\LoginLibrary.py
class LoginLibrary(object): def create_user(self, username, password): self._run_command('create', username, password) def change_password(self, username, old_pwd, new_pwd): self._run_command('change-password', username, old_pwd, new_pwd) def attempt_to_login_with_credentials(self, username, password): self._run_command('login', username, password) def status_should_be(self, expected_status): if expected_status != self._status: raise AssertionError("Expected status to be '%s' but was '%s'."% (expected_status, self._status))
由此可見,這個demo提供以下四個功能:
- 使用有效的密碼創建一個用戶。create_user(username, password)
- 使用有效的用戶名和密碼登陸。attempt_to_login_with_credentials( username, password)
- 修改已存在賬戶的密碼。change_password(username, old_pwd, new_pwd)
- 判斷用戶的當前狀態. status_should_be(expected_status)
Demo在RF內,首先可以創建一個suit級別的文件,然后導入operatingSystem庫(Remove File關鍵字使用到的庫文件)和用戶自定義LoginLibrary庫(測試服務器模塊login.py),拷貝sut到D:\python27下,再拷貝LoginLibrary.py到D:\python27\Lib文件夾下,搭建完后,架構如圖所示:
階段一:簡單的測試用例:就用LoginLibrary內提供的關鍵字進行以下測試.
這個測試用例的第二步和第三步就直接使用了LoginLibrary內提供的關鍵字進行測試
階段二:用戶關鍵字定義
上圖的第一步create valid user 就屬於用戶自定義的關鍵字,這個自定義的關鍵字主要實現了,創建用戶,然后判斷當前用戶狀態為success,則就能表現創建的確實為合法的用戶。
階段三:數據驅動測試用例
以前沒看文檔之前,看官網介紹,就是介紹RF支持關鍵字驅動也支持數據驅動,一直誤以為意思是指把測試數據全部寫在excel內,然后RF去讀取再實現,之前也有嘗試過,但是里面的邏輯較為復雜,也一直是一知半解。后面學習完文檔后,終於意會到RF所指的數據驅動是個神馬意思了。
Demo里面創建一個測試用例,創建用戶時,使用不合法的密碼。Demo先把這段邏輯抽成一個用戶關鍵字。實現如下:
該用戶自定義關鍵字的入參為password和error,然后創建一個測試用例:引用之前創建的用戶自定義關鍵字
end~直接在表格寫入參即可。這類測試用例,最常用於一些無狀態的接口測試項目中。
階段四:高級別測試用例
之所以稱為高級別的測試用例,其實我一直還不明白是為什么,就因為可用於編寫測試驅動開發的用例么?沒想通??這種測試用例主要由不攜帶實際參數的用戶自定義關鍵字組成。用戶自定義關鍵字有四個,如下所示:
自定義關鍵字的變量都直接寫好在RF內
然后使用given-when-then格式創建測試用例:
這類測試用例主要用於測試驅動開發的場景下.
在demo里面使用了db文件,這個文件作用就是充當數據庫,存儲用戶的一些信息。Demo里面有提到在每次運行測試用例之前刪除這個文件,然后還有就是查詢文件里的一些信息。
運行完后,這個文件是這樣的:
這個文檔基本的內容應該就是上面所描述的,從這次文檔的學習,總結下自己學到的知識點:
- RF內的數據驅動的含義
- 高級關鍵字的使用場景
- 系統保留常量和特殊字符常量
- Python語言
- 閱讀英文文檔能力
最后,奉上英文和中文翻譯的原文鏈接(當然最好還是養成閱讀英文文檔的習慣比較好)。
英文:https://github.com/robotframework/QuickStartGuide/blob/master/QuickStart.rst
中文翻譯版:
http://www.cnblogs.com/txw1958/archive/2012/05/10/2494805.html