Pythonは閉パッケージ構想を応用してunittest実行スクリプトを動的に生成する---問題を分析し、問題を解決し、ピットを記録する....

7067 ワード

なぜunittest実行スクリプトを動的に生成するのか、設計の考え方、コードは前文を参照して、ドアを転送します.はい、本文は前の文章の中の問題について分析して、穴を埋める道を記録しましょう.この穴は本当に深くて、長い間もがいてやっと出てきました.
まず、問題がどこにあるかを説明します.閉包を使用すると、閉包はバインド変数をクリアできません.変更できません.もし私が初めてtestall関数を2回実行し、1回目が正常で、2回目のtestall関数を1回実行すると、生成されたレポートに問題が発生し、1回目の実行の結果が発生します.すなわち、後サイクル運転が前サイクルより少ない限り、reportは必ず前の結果、必ず先のバグが発生する.
では、前の文でunittest実行スクリプトを動的に生成するピットの深さについてお話ししましょう.主に閉包に関連しています.また、閉包サイクル呼び出しunittestのTestクラス追加方法でsuiteを構成しています.Pythonの閉包は変数をバインドすることを知っています.クリアできません.変更できません.私たちは関連コードを貼りましょう.見やすいです.
 1 class Test(unittest.TestCase):  # TestCase 
 2     "   "
 3 
 4     def begin_req(self, apidata):  #    
 5         back = run_single_testcase(apidata)  #     
 6         YQ = 200  #     
 7         SJ = back.status_code
 8         self.assertEqual(SJ, YQ)
 9 
10 def demo(apidata):  #   
11     def tool(self):
12         Test.begin_req(self, apidata)  #   Test  
13 
14     setattr(tool, '__doc__', u'  %s' % str(apidata['name']))
15     return tool
16 
17 def testall(apidata): #       
18     for i in range(len(apidata)):
19         setattr(Test, 'test_' + str(i + 1), demo(apidata[i]))
20 
21 def suite(Apidata):  #   testall  Test ,  suit
22     testall(Apidata)
23     suit = unittest.makeSuite(Test)
24     return suit

コードの意味:クラスTestはunittestを継承する.TestCaseは何も言うことはありませんが、メソッドdemo閉包内部関数tool、toolメソッドの最初のパラメータselfはTestクラス(ポインタがTestクラスを指していると理解しています)、関数testallは閉包をループ呼び出し、関数suiteは私の上で注釈をはっきり書いています.
このピットには大きな迷いがあり、私は多くの时間を閉鎖関数に注目しています.私は閉鎖関数が原因だと思います.閉鎖関数のパラメータをどのように変更するかを研究しています.多くの方法を使っています.どんな容器のパラメータを入れて、後ろに容器のメンバーを削除して、すべて使いました.MMP...結果は確かに閉包によるものですが、問題は閉包関数に出ていません.閉包を理解するには他の文章を参考にしてください.ドアを転送してください.私たちは無駄ではありません.解決したコードを教えてください.
 1 def testall(apidata):
 2     nameList = []
 3     for i in range(len(apidata)):
 4         name = 'test_' + str(i + 1)
 5         setattr(Test, name, demo(apidata[i]))
 6         nameList.append(name)
 7     return nameList
 8 
 9 def suite(Apidata):
10     nameList = testall(Apidata)
11     suites = unittest.TestSuite()
12     for i in nameList:
13         suites.addTest(Test(i))
14     return suites

主にtestall関数とsuite関数を修正しましたが、実は問題はsuite関数の中で、元の関数は以下のコードです.
1 def suite(Apidata):  #   testall  Test ,  suit
2     testall(Apidata)
3     suit = unittest.makeSuite(Test)
4     return suit

 
3行目のmakeSuite関数とは、Testクラスを一度に追加する方法をsuiteといい、結果として閉包バインドされたオブジェクト(pythonはすべてオブジェクト)がTestで初めて実行組立されたTestクラスメソッドが閉包バインドされ、後の実行が前回より少なければ上書きされていない方法があり、エラーが発生するのでmakeSuite関数をaddTest関数に変更し、問題は解決して、私は長い間の閉鎖を研究して、結局問題はTest類の上で出て、心から疲れています.文章が下手です..お許しください..ありがとう..
転載先:https://www.cnblogs.com/fengyca/p/8434630.html