Pb协议的接口测试

> 本文节选自霍格沃兹测试学院内部教材




Protocol Buffers 是谷歌开源的序列化与反序列化框架。它与语言无关、平台无关、具有可扩展的机制。用于序列化结构化数据,此工具对标 XML

,支持自动编码,解码。比 XML 性能好,且数据易于解析。更多有关工具的介绍可参考官网。




Protocol Buffers官网:https://developers.google.com/protocol-buffers




Protocol Buffers 为跨平台设计,以 Python 为例,使用者配置  **.proto**  文件,利用 Protocol Buffers

工具即可生成 Python 代码,此代码就是使用者想要的数据结构。






如果编程语言换成了 Java ,使用者可使用相同的  **.proto**  文件,利用 Protocol Buffers 工具生成 Java

代码,此代码可被 Java 进行解析。






这么做的好处是可以跨语言交流,试想 Java 与 Python 间的数据通信,只需要利用  **.proto**

确定格式,就可随心编程,这个过程惬意无比。基于 Protocol Buffers 的测试也无比舒服。






你可选择自己的语言进行测试,比如 Python 。由于数据格式基于  **.proto**  配置文件,获取到这个文件即可生成数据类,比如下述

**.proto**  内容通过 `protoc --python_out=./ ./addressbook.proto` 命令即可生成

addressbook_pb2.py 文件:




  *   *   *   *   *   *   *   *   *   *   *   *   *   *   *   *   *   *   *   *   *   *   *   *   *   * 




    syntax = "proto2";  

    package tutorial;  

    message Person {  optional string name = 1;  optional int32 id = 2;  optional string email = 3;  

      enum PhoneType {    MOBILE = 0;    HOME = 1;    WORK = 2;  }  

      message PhoneNumber {    optional string number = 1;    optional PhoneType type = 2 [default = HOME];  }  

      repeated PhoneNumber phones = 4;}  

    message AddressBook {  repeated Person people = 1;}




测试人员的代码只需导入 addressbook_pb2 ,对其初始化后即可使用,比如对 Person 的字段加入一些测试值:




  *   *   *   *   *   *   *   * 




    import addressbook_pb2person = addressbook_pb2.Person()person.id = 1234person.name = "John Doe"person.email = "jdoe@example.com"phone = person.phones.add()phone.number = "555-4321"phone.type = addressbook_pb2.Person.HOME




最后,将 person 序列化后即可传输到被测对象。如果你的业务采用文件进行数据传输,可参考官方写文件的例子(采用 python2 ):




  *   *   *   *   *   *   *   *   *   *   *   *   *   *   *   *   *   *   *   *   *   *   *   *   *   *   *   *   *   *   *   *   *   *   *   *   *   *   *   *   *   *   *   *   *   *   *   *   *   *   *   *   *   *   *   * 




    #! /usr/bin/python  

    import addressbook_pb2import sys  

    # This function fills in a Person message based on user input.def PromptForAddress(person):  person.id = int(raw_input("Enter person ID number: "))  person.name = raw_input("Enter name: ")  

      email = raw_input("Enter email address (blank for none): ")  if email != "":    person.email = email  

      while True:    number = raw_input("Enter a phone number (or leave blank to finish): ")    if number == "":      break  

        phone_number = person.phones.add()    phone_number.number = number  

        type = raw_input("Is this a mobile, home, or work phone? ")    if type == "mobile":      phone_number.type = addressbook_pb2.Person.PhoneType.MOBILE    elif type == "home":      phone_number.type = addressbook_pb2.Person.PhoneType.HOME    elif type == "work":      phone_number.type = addressbook_pb2.Person.PhoneType.WORK    else:      print "Unknown phone type; leaving as default value."  

    # Main procedure:  Reads the entire address book from a file,#   adds one person based on user input, then writes it back out to the same#   file.if len(sys.argv) != 2:  print "Usage:", sys.argv[0], "ADDRESS_BOOK_FILE"  sys.exit(-1)  

    address_book = addressbook_pb2.AddressBook()  

    # Read the existing address book.try:  f = open(sys.argv[1], "rb")  address_book.ParseFromString(f.read())  f.close()except IOError:  print sys.argv[1] + ": Could not open file.  Creating a new one."  

    # Add an address.PromptForAddress(address_book.people.add())  

    # Write the new address book back to disk.f = open(sys.argv[1], "wb")f.write(address_book.SerializeToString())f.close()




也可从被测对象传来的文件中读数据:




  *   *   *   *   *   *   *   *   *   *   *   *   *   *   *   *   *   *   *   *   *   *   *   *   *   *   *   *   *   *   *   *   *   *   *   * 




    #! /usr/bin/python  

    import addressbook_pb2import sys  

    # Iterates though all people in the AddressBook and prints info about them.def ListPeople(address_book):  for person in address_book.people:    print "Person ID:", person.id    print "  Name:", person.name    if person.HasField('email'):      print "  E-mail address:", person.email  

        for phone_number in person.phones:      if phone_number.type == addressbook_pb2.Person.PhoneType.MOBILE:        print "  Mobile phone #: ",      elif phone_number.type == addressbook_pb2.Person.PhoneType.HOME:        print "  Home phone #: ",      elif phone_number.type == addressbook_pb2.Person.PhoneType.WORK:        print "  Work phone #: ",      print phone_number.number  

    # Main procedure:  Reads the entire address book from a file and prints all#   the information inside.if len(sys.argv) != 2:  print "Usage:", sys.argv[0], "ADDRESS_BOOK_FILE"  sys.exit(-1)  

    address_book = addressbook_pb2.AddressBook()  

    # Read the existing address book.f = open(sys.argv[1], "rb")address_book.ParseFromString(f.read())f.close()  

    ListPeople(address_book)




如果数据通过 https 传输,可采用 requests

,其它传输方式同理,请自行查阅数据传输工具。如果测试人员代码与被测对象建立了联系,即可收发测试数据,测试人员对接收到的数据编写测试用例即可。






   ** _ 

来霍格沃兹测试开发学社,学习更多软件测试与测试开发的进阶技术,知识点涵盖web自动化测试 app自动化测试、接口自动化测试、测试框架、性能测试、安全测试、持续集成/持续交付/DevOps,测试左移、测试右移、精准测试、测试平台开发、测试管理等内容,课程技术涵盖bash、pytest、junit、selenium、appium、postman、requests、httprunner、jmeter、jenkins、docker、k8s、elk、sonarqube、jacoco、jvm-sandbox等相关技术,全面提升测试开发工程师的技术实力

QQ交流群:484590337

公众号 TestingStudio

视频资料领取:https://qrcode.testing-studio.com/f?from=jianshu&url=https://ceshiren.com/t/topic/15844

点击查看更多信息

©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 217,657评论 6 505
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 92,889评论 3 394
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 164,057评论 0 354
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 58,509评论 1 293
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 67,562评论 6 392
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 51,443评论 1 302
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 40,251评论 3 418
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 39,129评论 0 276
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 45,561评论 1 314
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 37,779评论 3 335
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 39,902评论 1 348
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 35,621评论 5 345
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 41,220评论 3 328
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 31,838评论 0 22
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,971评论 1 269
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 48,025评论 2 370
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 44,843评论 2 354

推荐阅读更多精彩内容