如何从命令行为python脚本选择变量



我需要为不同的环境(不同的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。

最新更新