Saya memiliki modul yang impor unittest dan memiliki beberapa TestCases. Saya ingin untuk menerima beberapa opsi baris perintah (sebagai contoh di bawah ini, nama file data), tapi ketika saya mencoba untuk lulus pilihan saya mendapatkan pesan "opsi -aku tidak diakui". Apakah mungkin untuk memiliki unittest + memberikan pilihan untuk aplikasi (catatan: saya'm menggunakan optparse untuk menangani pilihan)? Terima kasih.
$ python test_app_data.py -i data_1.txt
option -i not recognized
=====================
follow-up: ini adalah sebuah implementasi dari solusi yang disarankan:
import cfg_master #has the optparse option-handling code
...
if __name__ == '__main__':
#add you app's options here...
options_tpl = ('-i', '--in_dir', '-o', '--out_dir')
del_lst = []
for i,option in enumerate(sys.argv):
if option in options_tpl:
del_lst.append(i)
del_lst.append(i+1)
del_lst.reverse()
for i in del_lst:
del sys.argv[i]
unittest.main()
Bangunan pada Alex's jawaban, it's benar-benar cukup mudah dilakukan dengan menggunakan argparse
:
if __name__ == '__main__':
parser = argparse.ArgumentParser()
parser.add_argument('--input', default='My Input')
parser.add_argument('filename', default='some_file.txt')
parser.add_argument('unittest_args', nargs='*')
args = parser.parse_args()
# TODO: Go do something with args.input and args.filename
# Now set the sys.argv to the unittest_args (leaving sys.argv[0] alone)
sys.argv[1:] = args.unittest_args
unittest.main()
Aku ingin't diuji semua bendera anda dapat lulus ke unittest untuk melihat apakah mereka bekerja atau tidak, tapi lewat tes nama-nama dalam melakukan pekerjaan, misalnya:
python test.py --input=foo data.txt MyTest
Berjalan MyTest dengan foo
dan data.txt
.
Dalam if __name__ == '__utama__':
bagian, yang anda're tidak menunjukkan kami, anda'll perlu optparse
dan kemudian del sys.argv[1:]
sebelum anda melewati kontrol untuk unittest
code, sehingga kedua kode doesn't mencoba untuk menafsirkan opsi baris perintah again bila anda've sudah berurusan dengan mereka. (Itu's sedikit lebih sulit untuk memiliki beberapa pilihan dari anda sendiri and juga melewati beberapa ke unittest
, meskipun hal itu dapat dilakukan jika anda memiliki kebutuhan yang kompleks).
Saya pikir saya'd berbagi solusi saya untuk menambahkan --debug beralih ke tes untuk mengontrol logger:
if __name__=='__main__':
parser = argparse.ArgumentParser(description="Build a compilation script")
parser.add_argument('--debug', help='Turn on debug messages', action='store_true', default=False)
args = parser.parse_args()
if args.debug:
log_level = logging.DEBUG
else:
log_level = logging.INFO
logging.basicConfig(level=log_level)
sys.argv.pop()
unittest.main()
Kemudian saya diperpanjang unittest.Kasus tes
untuk menambahkan logging:
class mcs_TestCase(unittest.TestCase, object):
def __init__(self, *args, **kwargs):
super(mcs_TestCase,self).__init__(*args,**kwargs)
logging.basicConfig()
self.logger = logging.getLogger(__name__)
...
Sekarang saya dapat mengubah pesan-pesan on dan off dalam pengujian saya menggunakan --debug, tapi itu akan diabaikan dalam regular regresi.
Kecil aplikasi standalone, saya menggunakan sebuah awal sentinel opsi (-t) dan panggilan unittest.main() sebelum memanggil argparse.ArgumentParser()
if __name__ == "__main__":
if len(sys.argv) > 1 and sys.argv[1] in ["-t", "--test"]:
del(sys.argv[1])
sys.exit(unittest.main()) # pass sys.argv[
p = argparse.ArgumentParser()
. . .
Anda tidak harus mengambil argumen dan pilihan untuk menjalankan unittests, seperti yang anda membuat mereka berjalan di bawah yang berbeda, kurang dapat diprediksi kondisi seperti ini. Anda harus mencari tahu mengapa anda harus menjalankan tes dengan data yang berbeda, dan membuat anda test suite lengkap yang cukup untuk menutupi tanah dari semua data set tanpa dijalankan secara berbeda-beda setiap waktu.