我需要为不同的环境(不同的url(运行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。
您可以使用argparse
来执行此操作:
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
这是一种方法。您正在创建一些arg参数--dev
、--stage
、--prod
,默认情况下--dev
设置为true。您也可以没有默认值(只需设置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')
你可以在这里阅读更多关于argparse
的信息。
我可以推荐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()
您要查找的是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要可靠得多。
在Jenkins中这样做几乎肯定比在Python中更容易。此外,您的devops管道控制开发、暂存和发布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。