當自定義的測試庫是類庫,則需要考慮一個問題:類實例。用類實現的庫可以有內部狀態, 這些狀態可以被關鍵字或構造函數修改. 因為這些狀態會影響到關鍵字實際的行為, 所以, 保證一個測試用例不會意外地影響到另一個用例顯得非常重要. 這種依賴行為有可能造成非常難定位的bug。例如, 添加了新的測試用例, 而這些用例使用庫的方式并不一致。
Robot Framework 為了保證測試用例之間的獨立性, 默認情況下, 它為每個測試用例創建新的測試庫實例. 然而, 這種方式不總是我們想要的, 比如有時測試用例需要共享某個狀態的時候. 此外, 那些無狀態的庫顯然也不需要每次都創建新實例。實例化測試庫類的方式可以通過屬性ROBOT_LIBRARY_SCOPE定義的三個作用域來控制
1.TEST CASE:為每個測試用例創建測試庫實例,用例間相互獨立,此為默認情況;
創建測試庫類:GTest.py
1 class GTest(object): 2 3 ROBOT_LIBRARY_SCOPE = "TEST CASE" 4 counter = 0 5 6 def __init__(self): 7 GTest.counter += 1 8 9 def count(self): 10 return self.counter, id(self)
創建測試套件login.robot:
1 *** Settings *** 2 Documentation Suite description 3 Library GTest.py 4 5 *** Test Cases *** 6 Test title 7 [Tags] DEBUG 8 @{res} count 9 log many @{res} 10 11 Test title2 12 [Tags] DEBUG 13 @{res} count 14 log many @{res}
從用例的執行結果來看,每個使用GTest庫的測試用例運行時,counter值加1,且實例id各不相同,所以SCOPE為"TEST CASE"的測試庫會為每個測試用例創建實例,這種配置更適用于嚴格控制用例間相互影響的場景;
2.TEST SUITE:為每個測試套件創建測試庫實例,該測試套件內的所有用例共享這個庫實例
修改測試庫類GTest.py, 將ROBOT_LIBRARY_SCOPE值替換為"TEST SUITE"
1 class GTest(object): 2 3 ROBOT_LIBRARY_SCOPE = "TEST SUITE" 4 counter = 0 5 6 def __init__(self): 7 GTest.counter += 1 8 9 def count(self): 10 return self.counter, id(self)
新增測試套件login2.robot
1 *** Settings *** 2 Documentation Suite description 3 Library GTest.py 4 5 *** Test Cases *** 6 Test title 7 [Tags] DEBUG 8 @{res} count 9 log many @{res} 10 11 Test title2 12 [Tags] DEBUG 13 @{res} count 14 log many @{res}
運行測試套件login.robot和login2.robot
從以上測試結果來看,圖1中,同一測試套件內所有測試用例獲取到的GTest實例相同;圖2中,不同測試套件獲取到的GTest實例不同,因此SCOPE設置為"TEST SUITE"時,會為每個測試套件創建一個測試庫實例;
3.GLOBAL:整個測試過程中只創建一個測試庫實例,所有測試套件、測試用例共享同一個測試庫實例
修改測試庫GTest.py,將ROBOT_LIBRARY_SCOPE修改為"GLOBAL"
1 class GTest(object): 2 3 ROBOT_LIBRARY_SCOPE = "GLOBAL" 4 counter = 0 5 6 def __init__(self): 7 GTest.counter += 1 8 9 def count(self): 10 return self.counter, id(self)
運行測試套件login.robot和login2.robot
從用例運行結果來看,測試套件login.robot和login2.robot所用GTest的同一個實例,且只有一個。因此SCOPE設置為"GLOBAL"后,整個測試過程中只生成一個測試庫實例。所有套件、測試用例共享這個測試庫實例;
robot官網中說明,如果同一個測試庫被多次以不同參數導入,則不管ROBOT_LIBRARY_SCOPE是否定義,每個測試套件會創建一個新的實例
創建測試庫GTest.py, ROBOT_LIBRARY_SCOPE定義為"GLOBAL"
1 class GTest(object): 2 3 ROBOT_LIBRARY_SCOPE = "GLOBAL" 4 counter = 0 5 6 def __init__(self, *args): 7 self.args = args 8 GTest.counter += 1 9 10 def count(self): 11 return self.counter, id(self)
創建測試套件login.robot
1 *** Settings *** 2 Documentation Suite description 3 Library GTest.py suite1 login1 4 5 *** Test Cases *** 6 Test title 7 [Tags] DEBUG 8 @{res} count 9 log many @{res} 10 11 Test title2 12 [Tags] DEBUG 13 @{res} count 14 log many @{res}
創建測試套件login2.robot
1 *** Settings *** 2 Documentation Suite description 3 Library GTest.py login2 suite2 4 5 *** Test Cases *** 6 Test title 7 [Tags] DEBUG 8 @{res} count 9 log many @{res} 10 11 Test title2 12 [Tags] DEBUG 13 @{res} count 14 log many @{res}
從測試用例運行結果來看,雖然將作用域定義成了全局的,但是由于在不同測試套件中以不同參數導入,所以用例執行過程中為不同的測試套件生成了不同的實例。
原文轉自:https://www.cnblogs.com/blackeyes1023/p/11613463.html