# 8. 命令行参数与unpack




### 背景

我们先稍微的修改一下上一节的用例生成器，加入接收命令行参数的功能。

作为测试用例的执行者，我们希望在创建用例的时候可以指定用例编号，以便能够更加系统的管理测试用例。

### 代码实现

新建名为```gen_test_case_with_id.py```，内容如下

```python

from sys import argv

script, case_id = argv
print(f"创建测试用例\n用例编号: {case_id}")
case_name = input("请输入用例名称:\n")
test_data = input("请输入用到的测试数据，比如: 测试站点=www.itest.info:\n")
test_steps = input("请输入测试步骤:\n")
test_assert = input("请输入测试断言(预期结果):\n")

formatter = """
用例编号: {}
用例名称: {}
测试数据: {}
测试步骤: {}
测试断言: {}
"""

print(formatter.format(case_id, case_name, test_data, test_steps, test_assert))
```

### 运行

在命令行中使用下面的命令去执行代码

```
$python gen_test_case_with_id.py itest_001

```

**注意： 我们在脚本名称后面加上了itest_001，这就是我们指定的用例编号，千万不要忘记传入这个参数，否则代码将会报如下的错误**

```
Traceback (most recent call last):
  File "gen_test_case_with_id.py", line 3, in <module>
    script, case_id = argv
ValueError: not enough values to unpack (expected 2, got 1)
```

### 你应该可以看到

按照下面展示的情况进行输入，如果没有出错的话，你应该可以看到命令行窗口显示如下的内容

```
创建测试用例
用例编号: itest_001
请输入用例名称:
登录成功
请输入用到的测试数据，比如: 测试站点=www.itest.info:
无
请输入测试步骤:
略
请输入测试断言(预期结果):
跳转到www.itest.info

用例编号: itest_001
用例名称: 登录成功
测试数据: 无
测试步骤: 略
测试断言: 跳转到www.itest.info
```

### import

python给我们预置了很多常用的功能，这些功能以module的形式组织起来，使用```import```关键字就可以把我们需要的内容导入进来，从而在脚本里使用。

上面的代码里，我们从sys module里导入了argv这个功能。


### argv

argv的意思是argument variable，这是大多数编程语言里的标准概念。argv里保存了脚本运行时你传入的所有的命令行参数以及脚本名称。看下面的例子

```python

python something.py first second third # argv = [something.py, first, second, third]
python something.py my_var # argv = [something.py, my_var]
python something.py # argv = [something.py]

```

所以argv里按顺序保存了脚本名称以及各个命令行参数。

**注意：命令行参数是以空格分隔的**

### unpack

简单来说，unpack就是把一组数据按顺序的保存到变量里。看下面的例子

```python
argv = ['something.py', 'first', 'second', 'third']
a, b, c, d = argv # a='something.py' b='first', c=second d='third'
argv = ['something.py', 'my_var']
script, the_var = argv # script='something.py' the_var='my_var'
```

上面的代码里```script, case_id = argv```的作用就是把第1个命令行参数赋值给变量```case_id```

### 动手时间

* 试着不传任何命令行参数，看一下python会报什么错
* 多传几个命令行参数，试一下会有什么效果




原始封面

![课程图片](https://images.unsplash.com/photo-1512758017271-d7b84c2113f1?w=300)


