• 学院里没有官方讲 macaca,你去外部的节点求助吧

  • 可能是节点发生了变化,比如位置发生了变化之类的

  • 文章不错,这个节点外面的人看不了,你可以重新发到外面去

  • 你的设备版本是多少?

  • 4 年 半的个人测试经历 at 2019年02月02日

    你的技术路线还是不错的,最后的几个技术方向都非常实用。继续深入学习吧,以后的成长不可限量。

  • 把未读消息做成一个单独的跟系统通知一样的 widget 吧,这样就可以知道错过的那些未读消息了

  • 我也是 bug 半年了

  • 其实是个递归算法,json 本质是一个 tree 节奏的数据,先把 json 转成标准的各个语言的结构体,比如 python 的 dict 或者 java 的 hashmap。剩下的就是递归判断 children 的类型并计数深度。我碰巧之前写过类似的算法,不过 scala 的代码。。。
    不得不说这个算法其实是测试工程里用的非常多的场景。用递归解决深层次数据的分析问题,在很多工具里都有一些应用的。

    appcrawler 里也有好几段是关于这个算法的使用的,比如从 xpath 匹配的节点中反向生成 xpath 定位表达式,把 html 网页的 page source 转成 appium 兼容的 xml 格式,对数据结构做扁平化好进行数据对比。

    def getAttributesFromNode(node: Node): ListBuffer[Map[String, String]] ={
      val attributesList = ListBuffer[Map[String, String]]()
      //递归获取路径,生成可定位的xpath表达式
      def getParent(node: Node): Unit = {
        if (node.hasAttributes) {
          val attributes = node.getAttributes
          var attributeMap = Map[String, String]()
    
          0 until attributes.getLength foreach (i => {
            val kv = attributes.item(i).asInstanceOf[Attr]
            attributeMap ++= Map(kv.getName -> kv.getValue)
          })
          attributeMap ++= Map("name()" -> node.getNodeName)
          attributeMap ++= Map("innerText" -> node.getTextContent.trim)
          attributesList += attributeMap
        }
    
        if (node.getParentNode != null) {
          getParent(node.getParentNode)
        }
      }
      getParent(node)
      //返回一个从root到leaf的属性列表
      return attributesList.reverse
    
    }
    

    不过这次我用昨天霍格沃兹测试学院的 Linux 三剑客公开课的技术给你一个简单的解法

    depth(){
    echo "$1" \
    sed 's#"[^"]*"##g'  \
    |  grep -oE  '{|}' \
    | awk '/{/{a+=1}/}/{a-=1}{if(max<a) max=a}{print max,a}END{print "max depth="max}'
    }
    
    # 结果貌似是6
    depth  '
    {
       "item":{
              "data": {
                "text": "123",
            },
            "children": [{
                "data": {
                    "text": "234"
                },
                "children": []
            }, {
                "data": {
                    "text": "345"
                },
                "children": [{
                    "data": {
                        "text": "456"
                    },
                    "children": []
                }, {
                    "data": {
                        "text": "plid"
                    },
                    "children": [{
                        "data": {
                            "text": "567"
                        },
                        "children": [....]
                    }, {
                        "data": {
                            "text": "678"
                        },
                        "children": [...]
                    }
                    ]
            }, {
                    // 不确定长度的Children节点
                }
    }
    '  
    
    # testerhome的json接口,貌似是4
    depth "$(curl https://testerhome.com/api/v3/topics.json 2>/dev/null)" 
    # taobao的某个接口,结果为2
    depth "$(curl http://ip.taobao.com/service/getIpInfo.php?ip=63.223.108.42 2>/dev/null )"
    
  • 晓之以情动之以理吧。

    首先沟通下,了解下这个人的困难,然后告诉他积极的做事和处世方法。私下沟通安慰下。每个人都有最困难的时候,失恋、家人去世、信用卡欠款被银行追债等等,对于过来人。都是小事,对于第一次遇到的人则是比工作更大的事情。

    同时告诉他错误让他意识到自己的错误,了解到自己的不负责任带来的影响。让他主动认错,不要让对方觉得是影响了你的管理权威,而是让对方意识到对团队合作和文化氛围上的负面影响。

    然后再告诉他可能的利害关系,比如影响的是自己的考核和晋升。而晋升加薪也许就是解决他目前困难的关键,劝他坚强不要因为一时跌倒影响未来整个人生。

    处理这个事情不要简单粗暴,不要伤害对方的自尊心。第一次要沟通并宽容处理,第二次再走公开批评。第三次基本上也够公司开除了,最最后的劝导就好。从另外一个方面来说,学习能力强的人基本六年后都会成为大牛级别的人物,帮他也是在帮你自己。

  • Linux 三剑客 at 2019年01月25日

    因为双引号存在,最外层单引号确保整个内容是原样传递给 awk 的。然后 awk 收到了双引号,双引号在 awk 内部也有转义,然后两个反斜杠变成了一个反斜杠。这样 FS 就会能正常的知道竖杠不是正则了。

  • Linux 三剑客 at 2019年01月24日

    花括号需要转义

  • 加我微信 seveniruby 一起做

  • 承诺做好就开源的项目,基本后来都没开源。
    虽然你是霍格沃兹测试学院的学员,我还是要要提前给你打个预防针。

    大家点了那么多赞了,我给你提几个建议
    自动化测试平台化是时下比较火的一个方向,不过很多人在平台化的过程中常常丢失了很多原本具备的灵活性和应用场景。举个例子,你设计了自动化用例中的动作与断言,加了断言是个很好的事情,不过却丢失了数据驱动和参数化的能力,反而限制了应用场景。 另外就是对于企业已有的用例,如何过渡?

    你设计了一个平台,尝试把自动化测试与测试管理融为一体,却常常把两方面的事情都搞的失去了灵活性和扩展性,最好收益反而不高,这是很多测开工程师容易犯的通病。我的建议是你把自动化用例进行更好的建模,或者融合已有的测试用例。不要强求所有的用例都从你的系统里去设计,这样更具开放性和扩展性。

    我比较看好的平台我记得我之前跟学员群里讨论过

    • 自动化用例的封装要具备良好的设计。可以融合已有的用例,也不丢失已有自动化用例的灵活性
    • 异步任务处理有很多复杂性,与其自己设计,不如交给第三方组建,比如 jenkins,通过调用 jenkins 的 api 实现更复杂的处理。
    • 开放。各个用例框架基本都遵从 xuni 风格或者 bdd 风格,通过定制可以轻松的支持更多用例框架导入会让整个平台更能海纳百川。
    • 报表灵活性,预定义报表需要,另外也要支持更灵活的多维度数据的自由组合报表生成

    我本来是在 TTF(TesterHome 测试基金会开源项目)里规划了这个通用测试平台项目的,到时候可以看看能不能凑起人来一起做。

  • 看了下调查结果,有部分同学反映没学会,下周我找个时间给大家加课。重点讲下 Linux 三剑客的语法和应用场景。

  • 作业 3
    head -10000 /tmp/nginx.log | awk '{print $1}' | sort | uniq -c | sort -nr | head -5

  • 以上答案全错

    • grep -E " 404 | 500 " /tmp/nginx.log
    • awk '$9=="404"' /tmp/nginx.log
  • 挺勤奋的小伙子,加油。如果你在甲方其实可以成长的更快,尽量去甲方吧。可以把简历给我,我给你推荐工作