• 这个异步和同步的概念是开发指出的,是因为接口返回结果很快,所以对于不知道接口实现的人来说,它相当于一个异步的过程。另外接口就算没等到 mqtt 返回的结果,也会返回一个结果。

    我需要测的是这个接口是否发报文给客户端而且当客户端收到并返回结果后,接口是否会返回 mqtt 发过来的结果,但是我很难做的部分是,当请求发出时,客户端收到 mqtt 的信息并且发送新的报文给接口。两个步骤如何同时进行。

  • 另外,有了解阿里的 mqtt 的大佬吗

    请问这个地方的 disconnect 需要发送的离线报文的格式(topic payload)是什么样的?

  • 如果以后有其他的资料会再补充。

  • 收货到了很多如何了解性能测试的方法,谢谢大家。

    如果以后有其他的资料会再补充。

  • 谢谢大佬!

  • 请问相关的工具是什么呢

  • 谢谢~我去研究一下

  • 有点懂了,自己也试了下,确实还是每个用例 setup 阶段就会创建新数据的方式,每次产生新的数据来解决问题,之前很疑惑 @ pytest.mark.parametrize()还是会导致两次数据一致 的问题,通过查阅一些资料发现用 @ pytest.fixture 里面的 params 和 ids 可以避免这个问题,也可以提供对用例的相关描述,并且即使不在一个文件也没有问题,如以下结构:

    # data.py
    fake = Faker()
    
    
    def init_data(fixture_value):
        if fixture_value == 10:
            return "case 1"
        elif fixture_value == 20:
            return "case 2"
        elif fixture_value == 30:
            return "case 3"
    
    
    @pytest.fixture(params=[10, 20, 30], ids=init_data)
    def init_data_by_status(request):
        status = request.param
        # status 标识不同的用例!
        print("fixture 参数", status)
        # 这里创建新数据!
        uid = fake.pyint(min_value=10086, max_value=99999, step=1)
        yield dict(.....)# 传入的数据
    
        # 这里可以清理数据操作,也可以定时清理,因为我的日志还比较完整,所以排查问题并不难,我选择的是即时清理。
    
    # test.py
    def test(init_data_by_status)
        # 业务流程开始
    

    谢谢大家的指教~ 学习到了很多细节上的问题的处理方法!

  • 如 19 楼的解释,请问使用了唯一性字段使用动态变量(随机数、时间戳、UUID 等?)之后仍然无法结合重试机制进行怎么办?

  • 比如:

    data1.py

    data_of_add_interface = [
            { 
                  "input": "a",
                  "expected": "error"
            }, 
            { 
                  "input": "123",
                  "expected": "error"
            }, 
            ...
    ]
    

    test_case.py

    from data1.py import data_of_add_interface
    
    @  pytest.mark.parametrize("data", data_of_add_interface)
    def test_case_1(data):
            response = request_interface(data["input"])
            assert data["expected"] == response
    

    main.py

    pytest.main(["./tests/test_case.py", "--reruns=2", "--reruns-delay=10", "-s"])
    

    所以执行第一条用例时,两次重跑,data 中的数据是一样的,都是输入” a“,当然,data.py 中,我是使用了每次都是新数据的,但是执行重跑时还是一样。

  • 还是需要重跑的,因为可能是用例比较多,出现过不稳定的情况,有时候运行会失败,但是有时候运行又没事

  • 请问排查的时候需要看什么呢?为什么删掉数据无法排查?

  • 我不是在 setup 中创数据的,而是直接弄一个数据模块,然后在测试用例中导入这个模块,因为有很多用例,所以没办法直接在 setup 中实现创造所有数据,比如 a 用例是字段 1 为空,b 用例字段 2 为空,因此我是直接重新设置了一个模块。但是这样也导致,导入之后,用例的数据不会发生改变,但是第一次运行和第二次运行的数据不一样。

  • 请问您是如何设计失败重跑机制的呢?

    我之前看到过的失败重跑机制有:

    1. pytest-rerunfailures 失败后 x 秒后重跑,在这个情况下,即使每次都是新的数据,重跑时的数据和第一次数据肯定是一样的,就会回到上面的问题;
    2. -lf 全部运行完之后重跑,之前使用了-lastfailed ,但是觉得它没有那么灵活,无法设置重跑次数。总觉得没那么方便也没那么好用(有时候是用例里面和 teardown 都出错了,但是它算两次测试失败等)
  • 开发不支持对数据库的增删查改

  • "输入合法用户信息,能够成功添加用户"这是一条用例,执行前得保证构造合法数据,想避免重复用时间戳做后缀是个不错的方法。

    如果是失败重跑的话,两次应该只能是一样的数据(即使添加了时间戳,但是通过@pytest.mark.parametrize()放进来的数据是不会变的),还是说这样必须在用例的流程中造数据来避免重复,但是这样不就违背了数据和业务分离的想法了吗?

  • 添加,然后查询,但是查询出错了,此时失败重跑,第二次,添加,这时会在添加时出错,因为实际上上一次添加成功了,所以这次再依次添加,会报错” 重复添加数据 “,所以两次报错原因会不一样,其他的上面说了。

  • 谢谢。之前没有考虑过接口测试还可以这样分层,学到了

  • 感觉懂是可以懂,但是实际上做接口自动化的时候,有的数据是非常复杂的,可能把它放到接口自动化流程的一部分,一个是有点不灵活(比如说用例 1 我需要某个特殊数据,用例 2 需要某个普通数据,那用一个函数可能实现起来比较复杂),另一个是放到业务流程中稍微有点臃肿了,可能我还是需要多练习一下具体的使用。

  • 极客时间 软件测试 52 讲 测试数据部分

  • 1.请问有具体的 demo 吗?
    2.请问您说的这个系统 创建数据有用到其他接口吗?

  • 如果出了这个错误,就不用停止 appium 服务,直接重新新建一个 session 就行了。

    如果你是必须要重启设备才行的话,可能是 desired_caps 配置上哪里有问题

  • 不好意思哦,我没有找到合适的解决方法,其实有 logcat,但是看了一下就是一直没找到某个元素然后超时了(而且截图里面明明存在那个元素)。
    我是直接为了防止后续用例失败,每一个 py 文件重开一个 session,然后就是重跑机制了。

  • 比如删除接口,重复执行还能保持结果一致,必定要做数据初始化。

    请问数据初始化如何实现?

    比如说增加接口,步骤一般是增加 -> 查询并校验增加是否成功,但是如果查询时校验失败,但是第二次执行会出错,因为” 增加了重复的内容 “,那么需要新增前查看是否存在数据,如果存在则将数据删除,那这样步骤变成了:

    查看要增加的数据是否存在 -> 如果存在则删除 -> 新增 -> 查询并校验是否新增成功。

    但是这种情况下,测试的是新增功能,但是用到了查询、删除接口,是默认这两个接口是正确的吗?可能查询功能可以在最前面校验好,但是删除接口,为了保持重复执行 结果一致,也会用到新增接口,需要默认新增接口正确吗?

  • self.driver.find_element_by_xpath("//android.widget.EditText[1]").click()
    self.driver.find_element_by_xpath("//android.widget.EditText[1]").send_keys('注册测试')
    

    那就让脚本点击而不是手动点击输入框试试?