How can I resolve "NameError: global name 'x' is not defined" error while running a Robot Framework testcase using a custom library?
How can I resolve "NameError: global name 'x' is not defined" error while running a Robot Framework testcase using a custom library?
我在 运行 Robot Framework 中的测试用例时看到“NameError:全局名称 'x' 未定义”错误。
以下是我的自定义库文件(根据 Bryan Oakley 的评论修改):
import re
def pass_fail_criteria():
if int(re.findall(r"NUM_FLOWS\n-+[\s\S]*?(\d+)\s*-+", x)[0]):
return "pass"
else:
return "fail"
以下为“pass_fail.robot”文件内容:
*** Settings ***
Library Selenium2Library
Library SSHLibrary
Library regexp_def.py
Suite Setup Go to gmail page
Suite Teardown Close All Browsers
*** Variables ***
${HOMEPAGE} https://www.gmail.com/intl/en/mail/help/about.html
${BROWSER} firefox
${LOGINPAGE} https://www.gmail.com/intl/en/mail/help/about.html
${FINALURL} https://mail.google.com/mail/
${FINALURL1} https://accounts.google.com/ServiceLogin?service=mail&continue=https://mail.google.com/mail/'
${HOST} 1.1.1.1
${USERNAME} test
${PASSWORD} test
*** Test Cases ***
Login into gmail
Go to gmail page
Login Page Should Be Open
Click Signin Button
Input Username test@gmail.com
Input Password test@123
Submit Credentials
Inbox page should open
Check Deep Packet Inspection Stats
Open Connection ${HOST}
enable ssh logging XYZ
Login ${USERNAME} ${PASSWORD}
Write enable
Write show dpi app stats gmail on AVC/ap7532-15E8CC
${x} Read Until Regexp .*#
Pass fail Criteria
${status} pass fail criteria
should be equal ${status} pass
${result} Pass fail criteria ${x}
*** Keywords ***
Go to gmail page
Open Browser ${HOMEPAGE} ${BROWSER}
Maximize Browser Window
Login Page Should Be Open
Location Should Be ${LOGINPAGE}
Click Signin Button
Click Element id=gmail-sign-in
Input Username
[Arguments] ${username}
Input Text id=Email ${username}
Input Password
[Arguments] ${password}
Input Text id=Passwd ${password}
Submit Credentials
Click Button id=signIn
Inbox page should open
Location Should Be ${FINALURL}
我在 运行 此文件时遇到以下错误:
C:\Users\symbol\Desktop\Projects\gmail_stats_with_pass_fail_criteria>pybot pass_
fail.robot
==============================================================================
Pass Fail
==============================================================================
Login into gmail | PASS |
------------------------------------------------------------------------------
Check Deep Packet Inspection Stats | PASS |
------------------------------------------------------------------------------
Pass fail Criteria | FAIL |
NameError: global name 'x' is not defined
------------------------------------------------------------------------------
Pass Fail | FAIL |
3 critical tests, 2 passed, 1 failed
3 tests total, 2 passed, 1 failed
==============================================================================
Output: C:\Users\symbol\Desktop\Projects\gmail_stats_with_pass_fail_criteria\ou
tput.xml
Log: C:\Users\symbol\Desktop\Projects\gmail_stats_with_pass_fail_criteria\lo
g.html
Report: C:\Users\symbol\Desktop\Projects\gmail_stats_with_pass_fail_criteria\re
port.html
C:\Users\symbol\Desktop\Projects\gmail_stats_with_pass_fail_criteria>
以下代码存在问题:
Pass fail Criteria
${status} pass fail criteria
should be equal ${status} pass
${result} Pass fail criteria ${x}
我该如何解决这个问题?
x
未定义,您在以下语句中使用 x
。
if int(re.findall(r"NUM_FLOWS\n-+[\s\S]*?(\d+)\s*-+",x)[0]):
将 x
作为参数传递给函数 pass_fail_criteria(x)
并使用 try except
def pass_fail_criteria(x):
try:
a = int(re.findall(r"NUM_FLOWS\n-+[\s\S]*?(\d+)\s*-+",x)[0])
return "pass"
except:
return "fail"
你有几个问题对你不利。您似乎对基于 Python 的关键字的工作原理存在根本性的误解。
两个关键字同名
您正在定义和导入一个名为 regexp_def.py 的库。其中有一个关键字,“pass_fail_criteria”。 Robot 会去掉下划线,所以从 Robot 的角度来看,这个关键字被命名为“Pass fail criteria”。
在您的测试用例中,您还创建了一个名为“通过失败标准”的关键字。目前还不清楚你为什么要这样做。不要那样做。删除该关键字;没必要。
变量“x”和“${x}”
您正在 pass_fail_criteria
中使用变量 x
,但您尚未定义它。这就是错误告诉你的。您需要定义它,或将其传递进来。要传递它,您需要将它作为一个参数,然后您需要为该参数提供一个值。这与任何其他关键字或任何其他函数没有什么不同。
在文件中 regexp_def.py:
import re
def pass_fail_criteria(x):
if int(re.findall(r"NUM_FLOWS\n-+[\s\S]*?(\d+)\s*-+",x)[0]):
return "pass"
else:
return "fail"
(注意定义中添加的参数)
在您的测试用例中:
Pass fail Criteria
${status} pass fail criteria ${x}
(注意第二行末尾的参数)
独立测试用例
您当前构建测试用例的方式是,您在一个测试用例中定义 ${x}
,然后尝试在另一个测试用例中使用它。我不知道这是不是有意为之,但很多人认为这种糟糕的测试用例设计。测试用例应该尽可能独立。
虽然您可以这样做(使用内置关键字Set Suite Variable),但我建议在名为“Check Deep”的测试用例中调用pass fail criteria
数据包检查统计信息”,其中定义了 ${x}
。
例如:
Check Deep Packet Inspection Stats
...
${x} Read Until Regexp .*#
${status} pass fail criteria ${x}
Run keyword if "${status}" == "pass" ...
我在 运行 Robot Framework 中的测试用例时看到“NameError:全局名称 'x' 未定义”错误。
以下是我的自定义库文件(根据 Bryan Oakley 的评论修改):
import re
def pass_fail_criteria():
if int(re.findall(r"NUM_FLOWS\n-+[\s\S]*?(\d+)\s*-+", x)[0]):
return "pass"
else:
return "fail"
以下为“pass_fail.robot”文件内容:
*** Settings ***
Library Selenium2Library
Library SSHLibrary
Library regexp_def.py
Suite Setup Go to gmail page
Suite Teardown Close All Browsers
*** Variables ***
${HOMEPAGE} https://www.gmail.com/intl/en/mail/help/about.html
${BROWSER} firefox
${LOGINPAGE} https://www.gmail.com/intl/en/mail/help/about.html
${FINALURL} https://mail.google.com/mail/
${FINALURL1} https://accounts.google.com/ServiceLogin?service=mail&continue=https://mail.google.com/mail/'
${HOST} 1.1.1.1
${USERNAME} test
${PASSWORD} test
*** Test Cases ***
Login into gmail
Go to gmail page
Login Page Should Be Open
Click Signin Button
Input Username test@gmail.com
Input Password test@123
Submit Credentials
Inbox page should open
Check Deep Packet Inspection Stats
Open Connection ${HOST}
enable ssh logging XYZ
Login ${USERNAME} ${PASSWORD}
Write enable
Write show dpi app stats gmail on AVC/ap7532-15E8CC
${x} Read Until Regexp .*#
Pass fail Criteria
${status} pass fail criteria
should be equal ${status} pass
${result} Pass fail criteria ${x}
*** Keywords ***
Go to gmail page
Open Browser ${HOMEPAGE} ${BROWSER}
Maximize Browser Window
Login Page Should Be Open
Location Should Be ${LOGINPAGE}
Click Signin Button
Click Element id=gmail-sign-in
Input Username
[Arguments] ${username}
Input Text id=Email ${username}
Input Password
[Arguments] ${password}
Input Text id=Passwd ${password}
Submit Credentials
Click Button id=signIn
Inbox page should open
Location Should Be ${FINALURL}
我在 运行 此文件时遇到以下错误:
C:\Users\symbol\Desktop\Projects\gmail_stats_with_pass_fail_criteria>pybot pass_
fail.robot
==============================================================================
Pass Fail
==============================================================================
Login into gmail | PASS |
------------------------------------------------------------------------------
Check Deep Packet Inspection Stats | PASS |
------------------------------------------------------------------------------
Pass fail Criteria | FAIL |
NameError: global name 'x' is not defined
------------------------------------------------------------------------------
Pass Fail | FAIL |
3 critical tests, 2 passed, 1 failed
3 tests total, 2 passed, 1 failed
==============================================================================
Output: C:\Users\symbol\Desktop\Projects\gmail_stats_with_pass_fail_criteria\ou
tput.xml
Log: C:\Users\symbol\Desktop\Projects\gmail_stats_with_pass_fail_criteria\lo
g.html
Report: C:\Users\symbol\Desktop\Projects\gmail_stats_with_pass_fail_criteria\re
port.html
C:\Users\symbol\Desktop\Projects\gmail_stats_with_pass_fail_criteria>
以下代码存在问题:
Pass fail Criteria
${status} pass fail criteria
should be equal ${status} pass
${result} Pass fail criteria ${x}
我该如何解决这个问题?
x
未定义,您在以下语句中使用 x
。
if int(re.findall(r"NUM_FLOWS\n-+[\s\S]*?(\d+)\s*-+",x)[0]):
将 x
作为参数传递给函数 pass_fail_criteria(x)
并使用 try except
def pass_fail_criteria(x):
try:
a = int(re.findall(r"NUM_FLOWS\n-+[\s\S]*?(\d+)\s*-+",x)[0])
return "pass"
except:
return "fail"
你有几个问题对你不利。您似乎对基于 Python 的关键字的工作原理存在根本性的误解。
两个关键字同名
您正在定义和导入一个名为 regexp_def.py 的库。其中有一个关键字,“pass_fail_criteria”。 Robot 会去掉下划线,所以从 Robot 的角度来看,这个关键字被命名为“Pass fail criteria”。
在您的测试用例中,您还创建了一个名为“通过失败标准”的关键字。目前还不清楚你为什么要这样做。不要那样做。删除该关键字;没必要。
变量“x”和“${x}”
您正在 pass_fail_criteria
中使用变量 x
,但您尚未定义它。这就是错误告诉你的。您需要定义它,或将其传递进来。要传递它,您需要将它作为一个参数,然后您需要为该参数提供一个值。这与任何其他关键字或任何其他函数没有什么不同。
在文件中 regexp_def.py:
import re
def pass_fail_criteria(x):
if int(re.findall(r"NUM_FLOWS\n-+[\s\S]*?(\d+)\s*-+",x)[0]):
return "pass"
else:
return "fail"
(注意定义中添加的参数)
在您的测试用例中:
Pass fail Criteria
${status} pass fail criteria ${x}
(注意第二行末尾的参数)
独立测试用例
您当前构建测试用例的方式是,您在一个测试用例中定义 ${x}
,然后尝试在另一个测试用例中使用它。我不知道这是不是有意为之,但很多人认为这种糟糕的测试用例设计。测试用例应该尽可能独立。
虽然您可以这样做(使用内置关键字Set Suite Variable),但我建议在名为“Check Deep”的测试用例中调用pass fail criteria
数据包检查统计信息”,其中定义了 ${x}
。
例如:
Check Deep Packet Inspection Stats
...
${x} Read Until Regexp .*#
${status} pass fail criteria ${x}
Run keyword if "${status}" == "pass" ...