背景
より良いテストに自分のスキルを開発するために、反復的変化は、テスト業界やインターネット業界に対処します。自己のpythonと自動テスト。
2017年には...他のテスト作業があるので、訓練タスクを実行する、断続的な自動テストの実行中に、セレンとの接触を開始したが、
事前にあなたのpythonの基本的な構文を学ぶことができることを示唆している(Pythonのチュートリアル)
タスク
自動テストフレームワークを構築し、効果的にもメンテナンスコストを考慮する必要があり、テストの実施を容易にすることができます。
プロセス
それは独学ですので、私の自動化フレームワークは、時期尚早かもしれません。腹を立て。ギャング案内してください〜
一般
含まれるもの:そのようHTMLレポート、ログ処理、電子メール、およびその他の基本的なページオブジェクトとしてクラスの基本的な公共メソッドを、
前記Pageオブジェクト後継者を導くために、実施例の方法を使用した後、各テストページのためにシステムを操作しているパッケージ。これは、メンテナンスがより便利に、複数回呼び出すことができます。
confに
システムパラメータ情報の基本的な構成は、等正しいユーザ情報、単純なログ・レベル、出力位置の一部、メール情報を、URLを含んでいてもよいです
データ
テストするデータドリブン必要または他のテストケースデータのために、同じ試験手順の後、試験データは、文書内で直接変更することができます。一時的にExcelを使用しました。それはまた、CSV、XMLなどの方法を採用することができます
ログ
一時的なログ出力などの出力、htmlreport IMGの出力を記録し、保存します。
テスト
そして、テストケースは、2つのモジュールのテストスイートを含み
その後、ディレクトリを作成することができ、よりPYファイルを書き込む機能がある場合は、テストケースの作成責任テストケース。
テストスイートは、テストスイートは(テストとテストクラスを含む)の需要に必要な試験項目で選択してもよいです
。注:addTest再利用されていない使用のDDTは、別のテストを追加します。
1
コードセクション
- BasePageクラスで共通
BasePageクラスのクラス(): グローバルlogG logG LogHandler =()ロガー。 DEF __init __(自己、ドライバ、URL =なし): self.wd =ドライバ (5)self.wd.implicitly_wait self.actions = ActionChains(self.wd) IF URL: self.urlのURL = 他: self.url = self.server_url_conf() 方法のいくつかの#ブラウザの動作が DEF get_conf_url(セルフ): self.wd.get(self.url) self.wd.maximize_window() logG。デバッグ( "入力しconf_url:" + STR(self.url)) DEF brower_close(セルフ): リターンself.wd.close() DEF brower_quit_all(セルフ): リターンself.wd.quit() ...だけでなく、リフレッシュ下記、前後など #測位方法は、ここで採用しBy.xx デフfind_web_element(自己、* LOC) : self.wd.find_elementの#(* LOC) の戻りself.wd.find_element(* LOC) オペレーティング#要素 :DEF(セルフ、LOC、テキスト)TYPE_TEXT リターンself.wd.find_element(* LOC).send_keys(テキスト) DEF clear_textを(自己、* LOC): リターンself.wd.find_element(* LOC).clear() DEF submit_func(セルフ、* LOC): リターンself.wd.find_element(* LOC).submit() DEF click_btn(セルフ、* LOC): リターンself.wd.find_element(* LOC).click() #マウス関連の DEFのmouse_move_to_element(セルフ、* LOC): elemは= self.find_web_element(* LOC) self.actions.move_to_element(ELEM).perform() ...こちらをクリック、ダブルクリック、右クリックする方法です #は、情報行動得る DEFのget_title(セルフ): (自己)get_web_url DEF: リターンはself.wd.current_url 返すself.wd.title デフget_element_text(自己、* LOC): リターンself.find_web_element(* LOC)の.text #元素是否存在真是 デフcheck_element_isexist(自己、LOC): isexist = Falseを 試してみてください。 EC.presence_of_element_located(LOC)(self.wd) isexist = Trueの 電子などの例外を除い: isexist = Falseの logg.debug( 'isexistかどうか:'、exc_info = TRUE) isexistを返す デフ(自己、LOC、テキスト)check_element_has_text: パス#省略 デフcheck_element_isdisplayed(自己、* LOC): パス#省略 #生成图 デフ__inser_img(自己、passorfailed、imgname): time_loc = time.strftime( "%のM%のD_%のH%のM%S"、time.localtime()) FILE_PATH = os.path.abspath(__ FILE__) FILE_PATH = os.path.join(FILE_PATH + "/../../ログ/%S_%s.png "%(imgname、time_loc)) self.wd.get_screenshot_as_file(FILE_PATH) logg.debug( 'insert_%s_img%s'は%(passorfailed、(FILE_PATH))) デフinsert_error_img(自己、imgname): 自己.__ inser_img("エラー」、imgname) デフinsert_success_img(自己、imgname): 自己.__ inser_img( "成功"、imgname) デフinsert_debug_img(自己、imgname): 自己.__ inser_img( "デバッグ"、imgname) デフserver_url_conf(自己): self.host = readconfig.ReadConfig()。単にgetServer( 'ホスト') self.port = readconfig.ReadConfig()。単にgetServer( 'ポート') urlvalue =自己。ホスト+ ":" + self.port ポート 戻りurlvalue __name__ == '__main__'の場合: テスト= BasePageクラス(webdriver.Chrome()) test.get_conf_url()
ページには、ログインページに共通のオブジェクト
このようなページとしてメソッドの数が含まれています
自分のユーザー名を入力し、パスワード、ログインをクリックしてください
logintestcaseでテスト
直接オブジェクトは、ユーザー名、パスワードを入力し、ログインページを使用して、サインインをクリックします
ポストメンテナンス、要素の変更は唯一のユースケースのためのページオブジェクトコードを変更する必要がある場合は、補正を必要としません
クラスAioLogin(BasePageクラス): グローバルlogg 。logg = LogHandler()GETLOG() username_loc =(By.NAME、 "ユーザ名") password_loc =(By.CSS_SELECTOR、 "入力[タイプ= 'パスワード']") login_loc =(BY .CLASS_NAME、 "ログイン-BTN") login_loc_oem =(By.ID) "提出" check_login_loc =(By.CLASS_NAME、 "エラーチップ") の要素= [username_loc、password_loc、login_loc、check_login_loc] log_menu =(By.CSS_SELECTOR 、 "[名= 'ログイン']") )logg.debug(要素を DEF SET_USERNAME(自己、ユーザ名): self.clear_text(* self.username_loc)#直接使用BasePageクラス的方法 self.type_text(self.username_loc、ユーザ名) logg.info(「ユーザ名を入力してください。」ユーザーネーム+) SLEEP(0.1) その他...
logintest
本明細書で使用する場合、データ駆動型のアプローチDDT
DDTインポートデータから、DDT、アンパック
@ddt クラスTESTLOGIN(たunittest.TestCase): 株式会社無料logGに参加 。logGはLogHandler()GETLOG()= @classmethod#クラスのメソッドを、実行は一度だけ起動します。各ユースケースと異なる設定が再度実行される :DEF setUpClass(CLS) cls.test = aiologinpage.AioLogin(webdriver.Chrome()) cls.test.get_conf_url() #プリント( 'スタートTestSearch') @classmethod DEF tearDownClassを( CLS): 。#1 TESTLOGIN()logg.info( "ブラウワーが終了") TESTLOGIN()test.brower_close()。 パス logindata = ReadExcel()のgetValue( 'ログイン')。 @data(* logindata) @unpack#がデータの複数のセットは、アンパック必要とするとき :DEFのtestcase2(セルフ、ユーザ名は、passwd、結果) logg.info(ユーザー名+ "" + passwdの+ "" + STR(結果を)) 後者の試験を変更するだけで直接ページオブジェクトのログインself.test.set_username(ユーザー名)#ユースケース、変化にそうでない場合は必要はありませんが self.test.set_password(passwdファイル) self.test.type_login_btn() #ログインアサーションと予想される結果に一貫性がある場合 self.assertTrue(self.test.check_login_result(結果)、 %S:MSG =「\ rをlogin_test失敗\ rのユーザー名\ R&LTのpasswd:%S「%(ユーザ名は、passwd)) IF __name__ == '__main__': unittest.main()
その他のページ
例えば、私は、ページパケット機器を作成しました
あなたは次の操作を行うことができます前に、私が最初にログインする必要があります
この時点で、あなたは、ログインページオブジェクトを書き込むためのcorrect_login方法でのconfから成功したログインユーザー名とパスワードを取得することができます。
DEF correct_login(自己): self.get_conf_url() self.userpasswd = self.correct_userpasswd_conf() self.set_username(self.userpasswd [0]) self.set_password(self.userpasswd [1]) self.type_login_btn()
その後、他のページの初期化時間がcorrect_loginを呼び出して直接ログインすることができます
テストスイートの追加の方法
TestSuiteの方法
#クラス追加
ST1を= unittest.makeSuite(TESTLOGIN)
#を用いて別々に複数の実施形態を追加
ST = unittest.TestSuiteインスタンス(マップ(TestClassName、[ 'TestCase1'、 'testcase2']))
ST = unittest.TestSuiteインスタンス(TestClaseeName( 'testcase1'))1つ以上のテスト#追加
ST2 = unittest.TestSuiteインスタンス()
st2.addTestsを(MAP(TestCaseClassName、[ 'testcase2'、 'TestCase1']))
st2.addTest(TestCaseClassName( 'TestCase1'))
#クラス追加
ST2を.addTest(unittest.makeSuite(TestClassName))TestLoader方法の
発見ディスカバリスクリプト
ST = unittest.TestLoader()。ディスカバリー( "dir_path"、パターン= "*のの.py")#loadTestFromTestCase加载测试类
ST1 = unittest.TestLoader()。loadTestsFromTestCase(TestLoginCheck)
ST2 = unittest.TestLoader()。loadTestsFromTestCase(TESTLOGIN)
STT = unittest.TestSuiteインスタンス()