2014-09-19 88 views
0

我有一個運行所有測試的模塊testrun.py。其中一個測試的是SWStatus這樣訪問非繼承類的變量

class HWStatus(myTest): 
    check = [] 
    def __init__(self): 
     super(SWStatus, self).__init__() 

    def setup(self): 
     return 

    def work(self): 
     """ 
     some functionality to calculate the value of i 
     i is either 10 or 20 
     """ 
     if i == 10: 
      status = True 
     else: 
      status = False 
     check.append(status) 

要運行這個測試,我做的蟒蛇testrun.py SWStatus,這讓我的結果。

我創建了HWStatus測試,它將運行SWStatus測試10次。

class HWStatus(myTest): 
    def __init__(self): 
     super(SWStatus, self).__init__() 

    def setup(self): 
     return 

    def work(self): 
     for i in xrange(10): 
      args = ['python', 'testrun.py', 'SWStatus'] 
      p = subprocess.Popen(args) 
      while p.poll() != 0: 
       time.sleep(amount_of_time) 

當我做testrun.py HWStatus,它運行SWStatus 10倍。

我在這裏面臨2個問題。 我想擁有check 10個值的列表。這樣每次它將根據邏輯附加TrueFalse。但是因爲我從HWStatus開始運行SWStatus,因此每次都會將check初始化爲空列表。所以即使我在做check.append(status),我只得到一個值。我應該如何解決這個問題?

我的第二個問題是,有沒有什麼辦法,我可以從我的HWStatus即使HWStatuswork方法訪問check列表不從SWStatus遺傳嗎?

我可以這樣做:

class HWStatus(myTest): 
    def __init__(self): 
     super(SWStatus, self).__init__() 

    def setup(self): 
     return 

    def work(self): 
     for i in xrange(10): 
      args = ['python', 'testrun.py', 'SWStatus'] 
      p = subprocess.Popen(args) 
      while p.poll() != 0: 
       time.sleep(amount_of_time) 
     print "List of 10",check 
+0

您可以訪問'SWStatus.check',但這不會解決您的問題,因爲您正在運行10個獨立的子進程。除非您以某種方式保存外部數據或添加一些進程間通信代碼,否則您將無法訪問您想要的內容。這不是一個單獨的班級中的「檢查」問題;由於使用了子流程,它實際上是在一個單獨的程序中。是否有你使用子進程的原因,而不是僅僅讓'HWStatus'導入'SWStatus'並且調用它的測試方法10次? – BrenBarn 2014-09-19 18:22:16

回答

0

繼承不影響蟒蛇成員可見;只要它們在詞法範圍內,python中的所有變量都是可見的。

儘管(在單獨的進程中)運行測試的方式創建SWStatus.check的不同副本。當你開始一個新的進程時,你創建了一個獨立的內存區域,所以你的代碼中創建了11個SWstatus.check變量副本,而且沒有任何人可以看到其他任何東西。

我懷疑你想要做的是並行運行測試,在這種情況下,最好是有測試返回作爲退出狀態,其狀態是什麼...

import sys 

if __name__ == 'main': 
    t = SWStatus() 

    sys.exit(not t.work()) 

但是,如果你絕對需要所有的測試運行在相同的地址空間,你可以使用線程而不是進程。但是,您需要使用類似Queue的內容來協調對內存的併發訪問。