自動化テストフレームワーク構築_面接問題


面接では自動化フレームワークの構築の質問に答えるかもしれませんが、できると言ったとき、答えられないと気まずいかもしれません.
まず、あなたが構築した枠組みの全体的な考えを紹介します.
  • config
  • report
  • test case
  • log
  • data
  • common_method

  • ここでcommon_methodはコアで、上のものを調和させる共通の方法を提供しています
    以下ではこれだけを紹介します.
    1.configのファイル内容を読み込む
    class Config:
        def __init__(self, config=CONFIG_FILE):
            self.config = YamlReader(config).data
    #   config      
        def get(self, element, index=0):
            """
            yaml     '---'   。 YamlReader        list,        ,      ,    index   。
                                 ,                。               。
            """
            return self.config[index].get(element)
    #   index        key value 
    

    2.jsonデータを抽出し、インタフェーステストでよく使う
             jmespath  ,      search      json  , 
    json      dict       json.loads(body)
    
    import json
    import jmespath
    
    
    class JMESPathExtractor(object):
        """
         JMESPath      ,  json             。
        """
        def extract(self, query=None, body=None):
            try:
                return jmespath.search(query, json.loads(body))
            except Exception as e:
                raise ValueError("Invalid query: " + query + " : " + str(e))
    
    
    if __name__ == '__main__':
        from utils.client import HTTPClient
        res = HTTPClient(url='http://wthrcdn.etouch.cn/weather_mini?citykey=101010100').send()
        print(res.text)
        # {"data": {
        #     "yesterday": {"date": "17    ", "high": "   31℃", "fx": "   ", "low": "   22℃", "fl": "",
        #                   "type": "  "},
        #     "city": "  ",
        #     "aqi": "91",
        #     "forecast": [
        #         {"date": "18    ", "high": "   28℃", "fengli": "", "low": "   22℃", "fengxiang": "   ",
        #          "type": "  "},
        #         {"date": "19    ", "high": "   29℃", "fengli": "", "low": "   22℃", "fengxiang": "  ",
        #          "type": "   "},
        #         {"date": "20    ", "high": "   29℃", "fengli": "", "low": "   23℃", "fengxiang": "   ",
        #          "type": " "},
        #         {"date": "21    ", "high": "   30℃", "fengli": "", "low": "   24℃", "fengxiang": "   ",
        #          "type": " "},
        #         {"date": "22    ", "high": "   29℃", "fengli": "", "low": "   24℃", "fengxiang": "  ",
        #          "type": "   "}
        #     ],
        #     "ganmao": "        ,       ,        。", "wendu": "25"
        #  },
        # "status": 1000,
        # "desc": "OK"}
    
        j = JMESPathExtractor()
        j_1 = j.extract(query='data.forecast[1].date', body=res.text)
        j_2 = j.extract(query='data.ganmao', body=res.text)
        print(j_1, j_2)
    
    

    3.データドライバexcelデータを読み出し、パラメータ化する(私が書いたデータドライバの内容を参照)
    4.ランダムデータの自動生成
    インタフェーステストでデータを作るためにデータを作るのは面倒で、うっかり繰り返してしまい、この問題を解決するためにいくつかの方法をカプセル化します.
     1)                 list,         :
    
    def factory_choice_generator(values):
        """          ,           ,    list      。 """
        def choice_generator():
            my_list = list(values)
            # rand = random.Random()
            while True:
                yield random.choice(my_list)
                #       
        return choice_generator
    

    2)ランダムな文字列が欲しい場合は、このように書くことができます.
    def random_str(min_chars=0, max_chars=8):
        """                  """
        return fake.pystr(min_chars=min_chars, max_chars=max_chars)
    

    3)ランダムな携帯番号、住所、emailをfakeライブラリで実現したい場合は、
    import random
    from faker import Factory
    
    fake = Factory().create('zh_CN')
    
    
    def random_phone_number():
        """     """
        return fake.phone_number()
    
    
    def random_name():
        """    """
        return fake.name()
    
    
    def random_address():
        """    """
        return fake.address()
    
    
    def random_email():
        """  email"""
        return fake.email()
    
    

    5.logメソッドをカプセル化し、私たちのlogコンテンツを抽出し、専門のlogファイルに置く
       logging     from logging.handlers   import TimedRotatingFileHandler 
    

    コードは次のとおりです.
    import os
    import logging
    from logging.handlers import TimedRotatingFileHandler
    from utils.config import LOG_PATH
    
    
    class Logger(object):
        def __init__(self, logger_name='framework'):
            self.logger = logging.getLogger(logger_name)
            logging.root.setLevel(logging.NOTSET)
            self.log_file_name = 'test.log'
            self.backup_count = 5
            #       
            self.console_output_level = 'WARNING'
            self.file_output_level = 'DEBUG'
            #       
            self.formatter = logging.Formatter('%(asctime)s - %(name)s - %(levelname)s - %(message)s')
    
        def get_logger(self):
            """ logger          ,  logger    ,     """
            if not self.logger.handlers:  #       
                console_handler = logging.StreamHandler()
                console_handler.setFormatter(self.formatter)
                console_handler.setLevel(self.console_output_level)
                self.logger.addHandler(console_handler)
    
                #             ,    backup_count 
                file_handler = TimedRotatingFileHandler(filename=os.path.join(LOG_PATH, self.log_file_name),
                                                        when='D',
                                                        interval=1,
                                                        backupCount=self.backup_count,
                                                        delay=True,
                                                        encoding='utf-8'
                                                        )
                file_handler.setFormatter(self.formatter)
                file_handler.setLevel(self.file_output_level)
                self.logger.addHandler(file_handler)
            return self.logger
    
    logger = Logger().get_logger()
    
    

    6. report
        report = REPORT_PATH + '\\    .html'
    
        test_suite = unittest.defaultTestLoader.discover('.', pattern='test*.py')
        result = BeautifulReport(test_suite)
        result.report(filename='    ', description='  deafult  ', log_path=REPORT_PATH)