PyQt5 で簡単なテストコードを書く.

この記事では,PyQt5の簡単なテストコードを書く.
pyqt5のテストコードの記事があまりみつからなかったので,( pytest-qtが使えそう?) テストケースも十個以下の小さなプログラムのために自分で,簡単なテストコードを書いた.
初期設定の部分をプログラムで書き換えて,GUI部分は自分で操作しなければいけないけれど…

PyQt5のアプリケーションを流しながら,他のプログラム部分を走らせることが出来ない.そこで,bash を用いて初期設定を変えながら,GUIを連続起動させる方針を取った.

コードは,https://github.com/akitoshiblog/pyqt5_test_economical よりダウンロード可能.

事前準備

bash で以下のコマンドを回して,初期設定ファイルを複数用意する.

mkdir -p test_texts
dir_name="test_texts/"
echo "first text" > $dir_name"test_text1.txt"
echo -e "long long\nlong long\nlong long" > $dir_name"test_text2.txt"

テスト用のアプリケーションは,”text.txt”からテキストを読み込んで表示させるプログラム.終了ボタンあり.

(pyqt5_qpp.py)
import sys
from PyQt5.QtCore import Qt
from PyQt5.QtWidgets import (QWidget, QPushButton, 
    QApplication, QLabel, QGridLayout)

class App(QWidget):
    def __init__(self):
        super().__init__()
        with open("text.txt") as f: 
            self.text = f.read()
        self.initUI()
        
    def initUI(self):
        title = QLabel("Explanation : ")
        labelReading = QLabel(self.text)
        quitButton= QPushButton("quit")
        quitButton.clicked.connect(self.quit)

        grid = QGridLayout()
        grid.addWidget(title,0,0,1,1) 
        grid.addWidget(labelReading,0,1,1,1) 
        grid.addWidget(quitButton,1,1,1,1) 
        
        self.setLayout(grid)    
        
        self.setGeometry(300, 300, 300, 150)
        self.setWindowTitle('sample app')
        self.show()
        
    def quit(self):
        QApplication.instance().quit()
        
        
        
if __name__ == '__main__':
    
    app = QApplication(sys.argv)
    ex = App()
    sys.exit(app.exec_())

テストコード

テストコードは,2つのファイルからなる.一つは,test_app.py で,pythonを起動するときに,テストケースの番号を入れると,その番号の設定に変えてくれるプログラム.
もう一つは,test_app.sh で,全てのケースに関して連続でGUIを起動させるようのプログラムだ.

test_app.py では,それぞれのtest関数に含まれたドキュメントを起動時に出力するようになっている.

(test_app.py)

import sys
import pyqt5_app
from PyQt5.QtWidgets import QApplication

class TestPyQT():

    def start_test(self):
        test_num = sys.argv[2]
        for m in dir(self):
            if m == "test" + str(test_num):
                print("method name : ",m)
                func = self.__getattribute__(m)
                print(func.__doc__)
                func()
                break
        
    def activate_gui(self):
        app = QApplication(sys.argv)
        ex = pyqt5_app.App()
        sys.exit(app.exec_())

    def set_text(self,path):
        with open(path, "r") as f: 
            s = f.read()
        with open("text.txt","w") as f: 
            f.write(s)

        print("# loaded file content")
        print(s) 

    def test1(self): 
        """Set first text.
        """
        self.set_text("test_texts/test_text1.txt")
        self.activate_gui()

    def test2(self): 
        """long text.
        """
        self.set_text("test_texts/test_text2.txt")
        self.activate_gui()

if __name__ == '__main__':
    print("#"*30)
    if len(sys.argv) != 3: 
        print(f"usage : python {sys.argv[0]} --case/-c ")
        sys.exit()
    test = TestPyQT()
    test.start_test()

後は以下のコードをbash test_app.shで回せばok.

(test_app.sh)
for i in {1..2};
    do python test_app.py -c $i;
done

すると以下の文章を出力しながら,GUIを終了する度に次のGUIを起動してくれる.

##############################
method name :  test1
Set first text.
        
# loaded file content
first text

##############################
method name :  test2
long text.
        
# loaded file content
long long
long long
long long

———-雑感(`・ω・´)———-
苦肉の策だけど,ないよりは頭をすっきりさせて作業出来た.
pythonの”__doc__”でdocumentにアクセスするためには,シングルクオーテーションマークではだめで,ダブルクオーテーションマークで記載しなければいけないのを忘れていたorz… 

コメント

タイトルとURLをコピーしました