0

私はPythonで書かれたテストファイルを持っています:

テスト ファイルは、できる限り軽量で書きやすくなければなりません。

次のようなスクリプトを作成したい:

  1. 入力引数を取ります
  2. これらの引数で initialize.py ファイルを開始します
  3. initialize.py によって作成された変数を使用してテスト ファイルを開始します。

私はいくつかの方法を考えました:

  • 2 つのファイルをインポートします。インポートでは、メイン スクリプトで戻り引数を使用できますが、入力引数を指定できないため、機能しません。
  • 両方のファイルを関数に変換します。initialize.py の問題ではありませんが、前述したように、テスト ファイルをできるだけ簡単かつ軽量に保ちたいので、それを避けることができればより良いでしょう。
  • 完全な解決策は、コードを初期化から単純に「コピー」して、テスト ファイルの先頭に配置することです (またはその逆)。両方のコードを含む一時ファイルを作成することはできますが、あまりクリーンではないと思います。

要約すると、同じ 25 行で始まる 100 個のファイルがあり、それらの 25 行を 1 つのファイルに入れ、毎回インポートしたいのと同じです。

物事を見る別の方法は、3 つのファイルです。

#File1.py
var1 = sys.argv(1)

#File2.py
var2 = var1+"second"

#File3.py
var3 = var1+var2+"third"
print var3

./File1.py を最初に開始し、「最初の 2 番目の 3 番目」を取得したい

私は成功します

#! /usr/bin/python
import sys

import subprocess
source_content = "#! /usr/bin/python\n"+"import sys\n"

sourcefile = "file2.py"
txt_file = open(sourcefile)
source_content += txt_file.read()

sourcefile = "file3.py"
txt_file = open(sourcefile)
source_content += txt_file.read()

destinationfile = "Copyfile2.py"
target = open (destinationfile, 'w')
target.write(source_content)

target.close()

chmodFile = "chmod 777 "+destinationfile
chmod = subprocess.Popen(chmodFile, shell=True)
chmod.wait()
arguments = str("./"+destinationfile+" ")
arguments += " ".join(map(str,sys.argv[1:len(sys.argv)]))
startTest = subprocess.Popen(arguments, shell=True)
startTest.wait()

しかし、「#! /usr/bin/python」を test2 から削除し、それらの同じファイルで var1 をテストして名前を sys.arg[1] に変更する必要がありました。そして、私はそれが良い解決策だとは思わない...

4

1 に答える 1

0

unittest モジュールを使用してみませんか?

import unittest

class BaseTest(unittest.TestCase):
    def initialisation_script_stuff(blah,etc):
        foo

    def setUp(self):
        common_setup_stuff()

    def tearDown(self):
        whatever

これで、各テスト ファイルで BaseTest から継承できます。

from moo import BaseTest

class CoolTest(BaseTest):
    def setUp(self):
        BaseTest.setUp(self)
        args = BaseTest.initialisation_script_stuff()
        do_stuff(args)

    def testNumberOne(self):
        self.assertEqual(1,1)

または、標準の単体テスト方法から離れたい場合...

ディレクトリ構造を仮定すると、次のようになります。

all_tests\
    __init__.py
    some_tests\
        __init__.py
        test1.py
        test2.py
    other _tests\
        __init__.py
        etc

いくつかの命名規則:

  • 各テスト py ファイルにはrun、テストを実行するという名前の関数があります
  • 各テスト py ファイルの名前は「test」で始まります
  • 各テスト グループ フォルダの名前は「_tests」で終わります

run_tests.py (またはそのようなもの...) という単一のスクリプトを作成します。

def run_tests():
    import os
    import importlib
    import re
    dTests = {}
    lFolders = [s for s in os.listdir('all_tests') if re.match('.*_tests$',s)]
    for sFolder in lFolders:
        sFolderPath = os.path.join('all_tests',sFolder)
        lTestFileNames = [s for s in os.listdir(sFolderPath) if re.match('^test.*py$',s)]
        for sFileName in lTestFileNames:        
            sSubPath = '{0}.{1}'.format(sFolder,sFileName.split('.')[0])
            dTests[sSubPath] = importlib.import_module('all_tests.{0}'.format(sSubPath))
    #now you have all the tests...
    for k in dTests:
        stuff = initialisation_stuff()
        test_result = dTests[k].run(stuff)
        do_whatever_you_want(test_result)             

if __name__ == "__main__":
    run_tests()

これで、テスト ファイルにボイラー プレート コードはまったく必要ありません。式に従う限り

于 2013-08-22T15:24:57.387 に答える