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

时间:2018-11-26 11:14:48

标签: python jenkins jobs args

我需要针对不同的环境(不同的网址)运行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。

4 个答案:

答案 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。