软件测试管理之Python中的配置管理文件

发表于:2021-10-19 09:47

字体: | 上一篇 | 下一篇 | 我要投稿

 作者:谢小玲    来源:知乎

  YAML是一个比XML,JSON数据格式的更加方便,简洁的,易于阅读的序列化数据格式。在很多的脚本语言中都有应用,下面以其在Python语言中为例,总结下个人的心得。
  在python中,我们一般用ini 文件来管理小规模的配置(用configparser来解析),用xml,json,或者csv,excel来管理大规模的配置。如果用yaml来管理配置,更加方便简单。
  首先要装 PyYAML
  安装起来很简单:
  pip install pyyaml
  我们可以参考阮一峰老师的教程:
  YAML语言教程
  总的来说,语法没什么难度,也是人们司空见惯的了。
  · 大小写敏感
  · 使用缩进表示层级关系
  · 缩进时不允许使用Tab键,只允许使用空格。
  · 缩进的空格数目不重要,只要相同层级的
  · 使用空白字元为文件缩排来表示结构;不过不能使用跳格字元(TAB)。
  · 注解由井字号( # )开始,可以出现在一行中的任何位置,而且范围只有一行(也就是一般所谓的单行注解)
  · 每个清单成员以单行表示,并用短杠+空白( - )起始。或使用方括号( [ ] ),并用逗号+空白( , )分开成员。
  · 每个杂凑表的成员用冒号+空白( : )分开键值和内容。或使用大括号( { } ),并用逗号+空白( , )分开。
  · 杂凑表的键值可以用问号 ( ? )起始,用来明确的表示多个词汇组成的键值。
  · 字串平常并不使用引号,但必要的时候可以用双引号 ( “ )或单引号 ( ‘ )框住。
  · 使用双引号表示字串时,可用倒斜线( \ )开始的跳脱字元(这跟C语言类似)表示特殊字元。
  · 区块的字串用缩排和修饰词(非必要)来和其他资料分隔,有新行保留(preserve)(使用符号 | )或新行折叠(flod)(使用符号 > )两种方式。
  · 在单一档案中,可用连续三个连字号(—-)区分多个档案。
  · 另外,还有选择性的连续三个点号( … )用来表示档案结尾。
  · 数值型: 直接书写即可。不区分整型还是浮点型。
  · 字符串: 字符串可以加引号,也可以不加。
  · 时间: ISO8601 格式。如2017-12-14t21:59:43.10-05:00
  · 日期: 采用复合 iso8601 格式的年、月、日表示。如1970-01-01
  · 关于强制类型转换: 可以通过两个英文感叹号+新的数据类型的方式来进行强制的类型转换。
  如:
  e: !!str 123
  f: !!str true
  将变为:
  { e: '123', f: 'true' }
  yaml.load与yaml.dump方法
  该模块提供了一些方法,不过常用的方法只有两个yaml.load和yaml.dump ,以下是一个版本相关的yaml 格式文件:
  treeroot:
      branch1:
          name: Node 1
          branch1-1:
              name: Node 1-1
      branch2:
          name: Node 2
          branch2-1:
              name: Node 2-1
  yaml.load方法:
  import yaml
  f = open('tree.yaml')
  dataMap = yaml.load(f)
  f.close()
  print dataMap
  执行结果:
  {'treeroot': {'branch2': {'branch2-1': {'name': 'Node 2-1'}, 'name': 'Node 2'}, 'branch1': {'branch1-1': {'name': 'Node 1-1'}, 'name': 'Node 1'}}}
  yaml与xml
  # xml标记两个site
  <site>
      <name>sina</name>
      <url>http://http://www.sina.com</url>
  </site>
  <site>
      <name>google</name>
      <url>http://www.google.com</url>
  </site>
  # 使用yaml标记两个site
  ---
  site:
      name: sina
      url : http://www.sina.com
  ---
  site:
      name: google
      url : http://www.google.com
  # 使用yaml标记两个site
  ---
  site: {name: sina, url: http://www.sina.com}
  ---
  site: {name: google, url: http://www.google.com}
  yaml与json
  准确的说json 应该算是yaml 标准下的一个字集,可以很方便的转换。
  a、转换YAML到JSON
  import yaml,json
  yml = """
  ---
    foo: bar
  """
  data = yaml.load(yml)
  json = json.dumps(data)
  print(json)
  b、转换JSON到YAML
  import json,yaml
  str = '{ "foo": "bar" }'
  data = json.loads(str)
  yml = yaml.safe_dump(data)
  print(yml)
  于是我们可以把操作yaml封装成一个类:
  class YAML():
      # Write YAML file
      @staticmethod
      def write_yml(save_path, data):
          with open(save_path, 'w', encoding='utf8') as outfile:
              try:
                  yaml.safe_dump(data, outfile, default_flow_style=False, allow_unicode=True)
              except yaml.YAMLError as exc:
                  print(exc)
      # Read YAML file
      @staticmethod
      def read_yml(load_path):
          with open(load_path, 'r') as stream:
              try:
                  data_loaded = yaml.safe_load(stream)
                  return data_loaded
              except yaml.YAMLError as exc:
                  print(exc)
      @staticmethod
      def read_settings_yml():
          return YAML.read_yml(yaml_path)
  每次只需要写好yaml文件以及路径就可以读写相应的文件,获取相应的值了。
  比如我们用appium做mobile的自动化,
  就可以简单写成:
  ---
  Android:
    platformName: Android
    platformVersion: 5.0
    deviceName: Nexus 5X
    appPackage: com.
    appActivity: com.ui.screens.activity.SplashActivity
    resetKeyboard: True
    noSign: True
    noReset: True
    deviceReadyTimeout: 5
  #iPhone
  IOS:
    platformName: IOS
    deviceName: iPhone 6s
    app: /Users/anderson/nQAdebug.app
    automationName: XCUITest
    allowTouchIdEnroll: True
    noSign: True
    noReset: True
    deviceReadyTimeout: 5
  然后实现起来也很简单:
  class Base_page():
      capabilities = YAML().current_device()
      if PLATFORM == 'Android':
          capabilities['app'] = AppPath.get_app_filename(build_path)
          capabilities['platformVersion'] = get_android_version()
          capabilities['deviceName'] = get_device_name()
  只要稍微管理下配置文件,就减少了很多维护成本了。

  本文内容不用于商业目的,如涉及知识产权问题,请权利人联系51Testing小编(021-64471599-8017),我们将立即处理
《2023软件测试行业现状调查报告》独家发布~

关注51Testing

联系我们

快捷面板 站点地图 联系我们 广告服务 关于我们 站长统计 发展历程

法律顾问:上海兰迪律师事务所 项棋律师
版权所有 上海博为峰软件技术股份有限公司 Copyright©51testing.com 2003-2024
投诉及意见反馈:webmaster@51testing.com; 业务联系:service@51testing.com 021-64471599-8017

沪ICP备05003035号

沪公网安备 31010102002173号