改善行为测试的性能

时间:2018-11-18 15:19:52

标签: python bdd python-behave

我们在管道中运行行为BDD测试。作为jenkins管道的一部分,我们在docker容器中运行测试。目前,运行所有测试大约需要10分钟。我们正在添加大量测试,并且在几个月后,可能会持续30分钟。它正在输出很多信息。我相信,如果减少输出的信息量,我可以使测试运行得更快。有没有一种方法可以控制行为输出的信息量?我只想在某些情况下打印信息。 我看了一下行为平行。看起来像是在python 2.7中。我们在python3中。 我正在查看行为提供的各种选项。

behave -verbose=false folderName (I assumed that it will not output all the steps) behave --logging-level=ERROR TQXYQ (I assumed it will print only if there is an error) behave --logging-filter="Test Step" TQXYQ (I assumed it will print only the tests that has "Test Step" in it) 以上都不奏效。

当前输出如下所示

Scenario Outline: IsError is populated correctly based on Test Id -- @1.7 # TestName/Test.feature:187 Given the test file folder is set to /TestName/steps/ # common/common_steps.py:22 0.000s And Service is running # common/common_steps.py:10 0.000s Given request used is current.json # common/common_steps.py:26 0.000s And request is modified to set X to q of type str # common/common_steps.py:111 0.000s And request is modified to set Y to null of type str # common/common_steps.py:111 0.000s And request is modified to set Z to USD of type str # common/common_steps.py:111 0.000s
When make a modification request # common/common_steps.py:37 0.203s Then it returns 200 status code # common/common_steps.py:47 0.000s And transformed result has IsError with 0 of type int # common/common_steps.py:92 0.000s And transformed result has ErrorMessages contain [] # common/common_steps.py:52 0.000s

我只想在出现错误时才打印所有这些内容。如果一切顺利,我不想显示此信息。

2 个答案:

答案 0 :(得分:1)

我认为默认日志级别INFO不会影响测试的性能。
我还使用docker容器运行回归套件,运行2300个测试场景大约需要2个小时。花了将近一天的时间,这是我的工作:
1。并行运行所有测试套件
这是减少执行时间的最重要原因。
我们花费了很多精力使回归套件能够并行化。
-进行原子,自治和独立的测试,以便您可以有效地并行运行所有测试。
-创建一个并行运行器以在多个进程上运行测试。我正在使用多处理和子处理库来执行此操作。
我不建议行为平行,因为它不再受支持。
您可以参考以下链接:
http://blog.crevise.com/2018/02/executing-parallel-tests-using-behave.html?m=1
-使用Docker Swarm将更多节点添加到Selenium Grid中。
您可以扩展以添加更多节点,并且最大节点数取决于cpus数。最佳实践是节点数= cpu数。
我有4台PC,每台PC都有4个核心,因此我可以扩展到1个集线器和15个节点。

2。在您的框架中优化同步。
删除time.sleep()
删除隐式等待。改用显式等待。

希望有帮助。

答案 1 :(得分:0)

我已经用传统方式解决了这个问题,但我不确定它的效果如何。我昨天才开始做这个,现在正试图用它来构建报告。方法如下,欢迎提出建议

这也解决了示例驱动的并行执行问题。

parallel_behave.py 运行命令(模仿行为命令的所有参数) py parallel_behave.py -t -d -f ......

initial_command = 'behave -d -t <tags>'
'''
the above command returns the eligible cases. may not be the right approach,                  but works well for me
'''

r = subprocess.Popen(initial_command.split(' '), stdout=subprocess.PIPE, bufsize=0)
finalsclist = []

_tmpstr=''
for out in r.stdout:
    out = out.decode('utf-8')
    # print(out.decode('utf-8'))
    if shellout.startswith('[') :
        _tmpstr+=out
    if shellout.startswith('{') :
        _tmpstr+=out
    if shellout.startswith(']'):
        _tmpstr+=out
        break

scenarionamedt = json.loads(_tmpstr)

for sc in scenarionamedt:
    [finalsclist.append(s['name']) for s in sc['elements']]

now the finalsclist contains the scenario name
ts = int(timestamp.timestamp)
def foo:
   cmd = "behave -n '{}' -o ./report/output{}.json".format(scenarioname,ts)

pool = Pool(<derive based on the power of the processor>) 
pool.map(foo, finalsclist)

这将创建许多单独的行为调用进程并在报告文件夹下生成json输出

*** 有来自 https://github.com/hugeinc/behave-parallel 的参考,但这是在功能级别。我只是将其扩展到场景和示例****