我需要针对不同的环境(不同的网址)运行python测试脚本。而且我需要从命令行定义使用哪个变量。将来,此参数将在Jenkins工作中使用。
script.py:
class TestLogin(unittest.TestCase):
@allure.step
def test_LoginValidation(self):
devURL = "http://url1/admin/login/"
stagingURL = "http://url2/admin/login/"
prodURL = "https://url3/admin/login"
driver.maximize_window()
driver.implicitly_wait(10)
driver.get(url)
lp = LoginPage(driver)
lp.login("login", "password")
time.sleep(2)
driver.quit()
在命令行中我需要写
python script.py stagingURL
在 driver.get(url)中方法 test_LoginValidation 的结果中,将使用我在命令行中定义的url。
答案 0 :(得分:2)
您可以使用remove_filter('template_redirect', 'redirect_canonical');
进行此操作:
argparse
这是一种实现方法。您正在创建一些arg参数import argparse
if __name__ == "__main__":
parser = argparse.ArgumentParser(description='Description')
parser.add_argument('--dev',
dest='dev',
action='store_true',
help="Help message")
parser.add_argument('--stage',
dest='stage',
action='store_true',
help="Help message")
parser.add_argument('--prod',
dest='prod',
action='store_true',
help="Help message")
parser.set_defaults(dev=True,
stage=False,
action=False)
args = parser.parse_args()
url = None
if args.dev:
url = "http://url1/admin/login/"
if args.stage:
url = "http://url2/admin/login/"
if args.prod:
url = "https://url3/admin/login"
# do something with the url
,--dev
,--stage
,并且默认情况下--prod
设置为true。您也可以没有默认值(只需设置--dev
)。
所以下次您可以运行:
dev=False
您可能要处理传递多个标志的情况。
您也可以这样:
python program.py --dev
python program.py --stage
python program.py --prod
示例:
import argparse
if __name__ == "__main__":
parser = argparse.ArgumentParser(description='Description')
parser.add_argument("--env",
choices={"dev", "stage", "prod"},
help="Some help message.")
args = parser.parse_args()
url = None
if args.env == "dev":
url = "http://url1/admin/login/"
elif args.env == "stage":
url = "http://url2/admin/login/"
elif args.env == "prod":
url = "https://url3/admin/login"
else:
print("Please specify the environment using --env flag.")
if url is not None:
print(url)
您可以详细了解$ python3 test2.py
Please specify the environment using --env flag.
$ python3 test2.py --env prod
https://url3/admin/login
$ python3 test2.py --env stage
http://url2/admin/login/
$ python3 test2.py --env dev
http://url1/admin/login/
$ python3 test2.py --env wrong
usage: test2.py [-h] [--env {stage,dev,prod}]
test2.py: error: argument --env: invalid choice: 'wrong' (choose from 'stage', 'dev', 'prod')
here。
答案 1 :(得分:1)
我可以推荐click
软件包来创建CLI。它真的很简单,有据可查,有很多选择,而且我认为比argparse更容易使用。
一个虚拟的例子:
import click
@click.command()
@click.option(
'--count',
default=1,
help='Number of greetings.'
)
@click.option(
'--name',
prompt='Your name',
help='The person to greet.'
)
def hello(**options):
"""Simple program that greets NAME for a total of COUNT times."""
for x in range(options['count']):
click.echo('Hello %s!' % options['name'])
if __name__ == '__main__':
hello()
运行时的外观:
$ python hello.py --count=3
Your name: John
Hello John!
Hello John!
Hello John!
它会自动生成格式正确的帮助页面:
$ python hello.py --help
Usage: hello.py [OPTIONS]
Simple program that greets NAME for a total of COUNT times.
Options:
--count INTEGER Number of greetings.
--name TEXT The person to greet.
--help Show this message and exit.
您可以直接从PyPI获取该库:
pip install click
如果只想创建CLI来参数化单元测试,则可以考虑使用@pytest.mark.parametrize
,它允许在测试函数或类中定义多组参数和固定装置。
一个例子:
import pytest
class TestLogin(object):
@pytest.mark.parametrize("url", [
"http://url1/admin/login/",
"http://url2/admin/login/",
"https://url3/admin/login",
])
def test_LoginValidation(self, url):
driver.maximize_window()
driver.implicitly_wait(10)
driver.get(url)
lp = LoginPage(driver)
lp.login("login", "password")
time.sleep(2)
driver.quit()
答案 2 :(得分:0)
您要寻找的是argparse。那应该可以让您完全按照自己的意愿进行操作,例如:
import argparse
parser = argparse.ArgumentParser()
parser.add_argument('url', help = 'The URL to use for ...', type = str)
这会将url设置为传递给函数的必需参数,并将其类型设置为str(这是默认行为,但明确表示是可以的。)
然后您可以使用以下方法提取参数:
args = parser.parse_args()
specified_url = args.url
从这里您可以照常进行。如果您希望将参数设置为可选参数但使用默认值,则也可以使用argparse。
使用环境变量是可行的,但是调试起来要困难得多,尤其是如果您希望此脚本由另一个软件argparse运行则更可靠。
答案 3 :(得分:0)
几乎可以肯定,在Jenkins中执行此操作比在Python中执行此操作容易。另外,您的devops管道控制dev,登台和发布URI的位置似乎很有意义(至少要这样做是明智的)。
def targetUrl = ''
switch (env.TARGET) {
case 'dev':
targetUrl = "http://url1/admin/login/"
break
// etc
}
sh "python script.py ${targetUrl}"
然后让python脚本查看sys.argv[1]
(这是传递给它的第一个参数),然后直接使用该URL。