整理不易,希望对各位学习软件测试能带来帮助

软件测试知识持续更新

  • 第十章 行为驱动开发 BDD 框架 lettuce 入门
    • 第一节、安装与例子
      • 安装
      • 例子(阶乘)
    • 第二节、lettuce 解析
    • 第三节、添加测试场景
    • 第四节、lettuce 的目录结构与执行过程
    • 第五节、lettuce webdriver 自动化测试
  • 第十一章 git/getcafe 管理自动化测试项目
    • 第一节、Git 搭建
      • 1.下载及安装 Git
      • 2.创建 SSH 秘钥
      • 3.添加 SSH 公钥到 GitCafe
      • 4.测试连接
    • 第二节、提交代码
    • 第三节、更新代码
      • 克隆代码
      • 更新提交
      • 删除提交
      • pull 最新代码到本地
    • 小结:
  • 附录
    • UliPad--python 开发利器环境搭建
    • Sublime--强大好用的代码编辑器
    • sublime 使用技巧
      • 一)在当前项目中,快速搜索文件
      • 二)添加注释
      • 三) 快速跳转到指定的行
      • 四) 搜索函数
      • 五) 隐藏菜单和显示菜单栏
  • 结语
  • 未完待续

第十章 行为驱动开发 BDD 框架 lettuce 入门

看到 TDD/BDD 一定会感觉高端大气上档次,不是我们普通吊民玩的,最的近在一直在摸索自动化测试。也想体验并引入 BDD 低调奢华的内涵。于是,在网络上搜索资料;话说这玩艺儿真的不太好理解,尤其对于没有丰富编程的经验的同学。
学习 BDD ruby 的 cucumber 是个不错的选择,但我是 python 流的,自然找了来它的兄弟 lettuce ,从官方版本(v0.1rc11)来看确实够年轻的,不过由 ruby 的 cucumber 在前面开路,lettuce 应该会发展的很顺利。
lettuce 除了官方文档外,几乎找不到其它资料,为了理解 lettuce ,我们不妨多去看看 cucumber的资料。
lettuce 是一个非常有用的和迷人的 BDD(行为驱动开发)工具。Python 项目的自动化测试,它可以执行纯文本的功能描述,就像 ruby 语言的 cucumber。
lettuce,使开发和测试过程变得很容易,可扩展性,可读性和-什么是最好的-它允许我们用自然语言去描述个一个系统的行为,你不能想象这些描述可以自动测试你的系统。

第一节、安装与例子

lettuce 官方网址:http://lettuce.it/

安装

请确认你已经安装了 python 以及 pip 安装包管理工具。
不管是 windows 还是 linux 环境,进入 pip 目录,只需下面一个命令就可以安装 lettuce .
user@machine:~$ [sudo] pip install lettuce
安装好 lettuce 后,如果在终端直接执行 lettuce 命令,得到以下输出:

哎呀!不能发现 features ,lettuce 期望在当前目录下创建 features 子目录

例子(阶乘)

下面就通过官网的例子来领略 lettuce 的风骚。
什么阶乘?
0!=1
1!=1
2!=2×1=2
3!=3×2×1=6

10!=10×9×8×7×6×5×4×3×2×1=3628800

下面是用 python 语言的两种阶乘实现:

#coding=utf-8
#循环实现
def f(n):
c = 1
for i in range(n):
i=i+1
c=c*i
return c
#递归实现
def f2(n):
if n > 1:
return n*f2(n-1)
else:
return 1
#调用方法
print f(10)
print f2(10)

OK!介于我们理解上面阶乘的基础上,来看看 BDD 是如何实现的。

第二节、lettuce 解析

创建以下目录结构:
…/tests/features/zero.feature
/steps.py
现在我们来编写 zero.feature 文件的内容

Feature: Compute factorial
In order to play with Lettuce
As beginners
We'll implement factorial
Scenario: Factorial of 0
Given I have the number 0
When I compute its factorial
Then I see the number 1

我这里对上面的内容做个翻译:

功能: 计算阶乘
为了使用 lettuce
作为初学者
我们将实现阶乘
场景: 0的阶乘
假定我有数字0
当我计算它的阶乘
然后,我看到了1

是不是很自然的描述?!第一段功能介绍,我要实现什么功能;第二段场景,也可以看做是一条测试用例,当我输入什么数据时,程序应该返回给我什么数据。

虽然是自然语言,但还是有语法规则的,不然一千个人有一千中描述,程序以什么样的规则去匹配呢?

其实它的语法规则非常简单就几个关键字,记住他们的含义及作用即可。


  • Feature(功能)
  • Scenario(情景)
  • Given(给定)
  • And(和)
  • When(当)
  • Then(则)

他们的含义与原有自动化测试框架的概念相似,类比如下:

关于 feature 文件的作用,执行以及语法规则将在下一节中详细介绍,这一节主要先来体验 luttuce的风骚。
有了上面 zero.feature 文件的行为做指导,下面打开 steps.py 文件来编写我们的程序。

from lettuce import *
@step('I have the number (\d+)')
def have_the_number(step, number):
world.number = int(number)
@step('I compute its factorial')
def compute_its_fatorial(step):
world.number = factorial(world.number)
@step('I see the number (\d+)')
def check_number(step, expected):
expected = int(expected)
assert world.number == expected, \
"Got %d" % world.number
def factorial(number):
number = int(number)
if (number == 0) or (number == 1):
return 1
else:
return number

咋一看怎么跟我上面实现阶乘的代码相差甚远呀!不知道你和你的小伙伴有没有惊呆!?好吧,以我拙劣的 python 语言水平试着来分析一下,这是啥?这是啥?这又是啥?

from lettuce import *
引入 lettuce 下面的所有包

@step(‘I have the number (\d+)’)
@step 字面意思是步骤
I have the number (\d+) 对应的就是 zero.feature 文件中的第六句:Given I have the number 0
(\d+) 是一个正则表达式,\d 表示匹配一个数字,+ 表示匹配的数字至少有一个或多个。关于这个可以参考其他 python 正则表达式的资料。

第一步:

@step('I have the number (\d+)')
def have_the_number(step, number):
world.number = int(number)

定义一个方法 have_the_number,把假设的输入(0)转换成整型放入 world.number 中。

第二步:

@step('I compute its factorial')
def compute_its_fatorial(step):
world.number = factorial(world.number)

把 have_the_number 方法中 world.number 的变量值(0)放入 factorial() 方法中,并把结果返再赋值给 world.number 变量。
I compute its factorial 对应的就是 zero.feature 文件中的第七句:When I compute its factorial

第三步:

def factorial(number):
number = int(number)
if (number == 0) or (number == 1):
return 1
else:
return number

这个是 factorial()方法被调用时的处理过程,对参数的内容转换成整数,判断如果等于0或1的话就直接
返回1,否则返回具体的数。(处理结果给了第三步的 world.number)

第四步:

@step('I see the number (\d+)')
def check_number(step, expected):
expected = int(expected)
assert world.number == expected, \
"Got %d" % world.number

expected 获取的是 zero.feature 文件中预期结果, 与第三步处理的实际结果(world.number)进行比较;assert 函数进行断言结果是否正确。
I see the number (\d+)对应的就是 zero.feature 文件中的第八句:Then I see the number 1

运行
切换到 tests 目录下,运行 lettuce 命令:
fnngj@fnngj-H24X:~/python/lettuce/tests$ lettuce
运行结果如下:

运行结果很清晰,首先是 zero.feature 文件里功能描述(feature),然后场景(scenario)每一步所对应steps.py 文件里的哪一行代码。

最后给出运行结果:
Feature(1 passed) 一个功能通过
Scenario(1 passed) 一个场景通过
Steps(3 passed) 三个步骤通过

第三节、添加测试场景

下面我们可以在 zero.feature 中多加几个场景(测试用例):

Feature: Compute factorial
In order to play with Lettuce
As beginners
We'll implement factorial
Scenario: Factorial of 0
Given I have the number 0
When I compute its factorial
Then I see the number 1
Scenario: Factorial of 1
Given I have the number 1
When I compute its factorial
Then I see the number 1
Scenario: Factorial of 2
Given I have the number 2
When I compute its factorial
Then I see the number 2
Scenario: Factorial of 3
Given I have the number 3
When I compute its factorial
Then I see the number 6

运行结果:

嗯??第四场景没通过,3!=321=6 这个预期结果肯定是正确的,那就是代码的逻辑有问题吧!如果你细心的话一定发现了 setup.py 中的代码并未真正实现阶乘,我们需要对它进行修改:

#coding=utf-8
from lettuce import *
@step('I have the number (\d+)')
def have_the_number(step, number):
world.number = int(number)
print world.number
@step('I compute its factorial')
def compute_its_fatorial(step):
world.number = factorial(world.number)
print world.number
@step('I see the number (\d+)')
def check_number(step, expected):
expected = int(expected)
assert world.number == expected, \
"Got %d" % world.number
def factorial(number):
number = int(number)
if (number == 0) or (number == 1):
return 1
else:
return number*factorial(number-1)

代码修改部分:

def factorial(number):
number = int(number)
if (number == 0) or (number == 1):
return 1
else:
return number*factorial(number-1)

参照本文开头,通过递归的方式实现阶乘的代码,现在才算完整的实现阶乘。OK !再来运行以下脚本吧!全绿了有木有!!

第四节、lettuce 的目录结构与执行过程

Lettuce 是 python 世界的 BDD 框架,开发人员主要与两类文件打交到,Feature 文件和相应的 Step文件。Feature 文件是以 feature 为后缀名的文件,以 Given-When-Then 的方式描述了系统的场景(scenarios)行为;Step 文件为普通的 python 文件,Feature 文件中的每个 Given/When/Then 步骤在Step文件中都有对应的Ruby执行代码,两类文件通过正则表达式相关联。下面笔者大家简单对lettuce工程的目录结构和执行过程进行分析。

目前大多数教程都建议采用以下目录结构,所有的文件(夹)都位于 features 文件夹下。
…/tests/features/test.feature
/step_definitions/test.py
/support/env.py

Feature 文件(如 test.feature)直接位于 features 文件夹下,可以为每个应用场景创建一个 Feature文
件;与 Feature 文件对应的 Step 文件(如 test.py)位于 step_definitions 子文件夹下;同时,存在
support 子文件夹,其下的 env.py 文件为环境配置文件。在这样的目录结构条件下执行 lettuce 命令,
会首先执行 env.py 做前期准备工作,比如可以用 webdriver 新建浏览器窗口,然后 lettuce 将 test.py
文件读入内存,最后执行 test.feature 文件,当遇到 Given/When/Then 步骤时,lettuce 将在 test.py
中搜索是否有相应的 step,如果有,则执行相应的 python 脚本。

这样的目录结构只是推荐的目录结构:对于 lettuce 而言,除了顶层的 features 文件夹是强制性的之外,其它目录结构都不是强制性的,lettuce 将对 features 文件夹下的所有内容进行扁平化(flatten)处理和首字母排序。具体来说,lettuce 在运行时,首先将递归的执行 features 文件夹下的所有 python文件(其中则包括 Step 文件),然后通过相同的方式执行 Feature 文件。但是,如果 features 文件夹下存在 support 子文件夹,并且 support 下有名为 env.py 的文件,lettuce 将首先执行该文件,然后执行support 下的其它文件,再递归执行 featues 下的其它文件。

比如有如下 lettuce 目录结构:
…/tests/features/a.feature
/a.py
/b.feature
/b.py
/other/c.feature
/other/f.py
/other/g.py
/setup_definitions/e.py
/support/c.py
/support/d.py
/support/env.py

此时执行 lettuce 命令,得到以下输出(部分)结果:

env.py
c.py
d.py
a.py
b.py
f.py
g.py
e.py

上面结果即为 python 文件的执行顺序,可以看出,support 文件夹下 env.py 文件首先被执行,其次按照字母排序执行 c.py 和 d.py;接下来,lettuce 将 features 文件夹下的所用文件(夹)扁平化,并按字母顺序排序,从而先执行 a.py 和 b.py,而由于 other 文件夹排在 step_definitions 文件夹的前面,所以先执行 other 文件夹下的 Ruby 文件(也是按字母顺序执行:先 f.py,然后 g.py),最后执行step_definitions 下的 e.py。

当执行完所有 python 文件后,lettuce 开始依次读取 Feature 文件,执行顺序也和前述一样,即:
a.feature --> b.feature --> c.feature

笔者还发现,这些 python 文件甚至可以位于 features 文件夹之外的任何地方,只是需要在位于features 文件夹之内的 python 文件中 require 一下,比如在 env.py 中。

第五节、lettuce webdriver 自动化测试

下面向读者介绍如何通过 lettuce 和 webdriver 结合来编写自动化脚本。

第一步,安装 lettuce (在本章第一节已经安装)
user@machine:~$ [sudo] pip install lettuce
第二步,安装 lettuce_webdriver
https://pypi.python.org/pypi/lettuce_webdriver
user@machine:~$ [sudo] pip install lettuce_webdriver
第三步,安装 nose(nose 继承自 unittest,为 python 自动化测试框架,且更容易使用)
https://pypi.python.org/pypi/nose/
user@machine:~$ [sudo] pip install lettuce

…/tests/features/google.feature
/step_definitions/setps.py
/support/terrain.py
google.feature

Feature: Go to google
Scenario: Visit Google
Given I go to "http://www.google.com/"
When I fill in field with class "gsfi" with "selenium"
Then I should see "seleniumhq.org" within 2 second

setps.py

from lettuce import *
from lettuce_webdriver.util import assert_false
from lettuce_webdriver.util import AssertContextManager
def find_field_by_class(browser, attribute):
xpath = "//input[@class='%s']" % attribute
elems = browser.find_elements_by_xpath(xpath)
return elems[0] if elems else False
@step('I fill in field with class "(.*?)" with "(.*?)"')
def fill_in_textfield_by_class(step, field_name, value):
with AssertContextManager(step):
text_field = find_field_by_class(world.browser, field_name)
text_field.clear()
text_field.send_keys(value)

terrain.py

from lettuce import before, world
from selenium import webdriver
import lettuce_webdriver.webdriver
@before.all
def setup_browser():
desired_capabilities = webdriver.DesiredCapabilities.FIREFOX
desired_capabilities['version'] = '' desired_capabilities['platform'] = 'ANY'
desired_capabilities['browserName'] = 'firefox'
desired_capabilities['avascriptEnabled'] = True
world.browser = webdriver.Remote(
desired_capabilities=desired_capabilities,
command_executor="http://127.0.0.1:4444/wd/hub"
)

本例子人运行需要启动 selenium server :

参考 selenium grid 一章的学习,启动 selenium server ,执行 lettuce 运行脚本,提示 2passed 和 1failed ,失败语句为。
Then I should see “seleniumhq.org” within 2 second

请读者根据所学习的 lettuce 知识以及前面的内容排查错误的原因并修正。

第十一章 git/getcafe 管理自动化测试项目

当我们的自动化框架在项目的实践中逐渐成熟并形成一定规模之后,自动化脚本开发与维护也不是由一人所能完成的,那么必定会有新人员参与脚本的开发与维护工作。那么多人协同开发必定需要引入版本控制工具来对项目进行控制和管理。

Git 是一个开源的分布式版本控制系统,用以有效、高速的处理从很小到非常大的项目版本管理。Git 是
Linus Torvalds 为了帮助管理 Linux 内核开发而开发的一个开放源码的版本控制软件。相比 CVS 、SVN
等版本控制工具,Git 无疑更大优秀,功能更大强大,在项目版本管理中被越来越多的广泛的使用。但 Git相对来说比较难学。

使用 git 来管理项目有两种方式,一种是本地部署 git 版本管理系统,另一种是通过在线的代码托管。
本地部署 git 版本管理系统,需要自己来搭建环境,但项目的提交与更新速度快,更适合比较封闭项目;
使用在线托管最大的好处是在有网络的情况下可以随时随地的提交自己的代码,但项目是公开的,当然也可以创建私有项目,大多属于付费服务。

在代码托管服务器,github 无疑是最优秀的,其优秀稳定的服务吸引了大批开发者和开源团队贡献自
己的代码和项目。但由于网站没有中文版,对于初学 git 的读者来说又增加了层学习难度,所以,在本例
子笔者选用了 gitcafe 来讲解如何创建和提交自己的项目代码。gitcafe 是国内非常优秀的代码托管服务网站,而且与 github 的使用极为相似。

第一节、Git 搭建

1.下载及安装 Git

根据你当前使用的系统平台,请下载并安装相应的客户端软件。
MacOSX 用户下载链接: https://github.com/timcharper/git_osx_installer/downloads
Windows 用户下载链接:http://code.google.com/p/msysgit/downloads/list

Linux 平台安装方法如下:
Debian/Ubuntu $ apt-get install git-core
Fedora $ yum install git
Gentoo $ emerge --ask --verbose dev-vcs/git
Arch Linux $ pacman -S git

下载并安装完成后,通常在 Mac OSX 及 Linux 平台下我们用终端工具 (Terminal) 来使用 Git ,而在
Windows 平台下用 Git Bash 工具。

root@fnngj-H24X:~# apt-get install git-core

2.创建 SSH 秘钥

在你的电脑与 GitCafe 服务器之间保持通信时,我们使用 SSH key 认证方式来保证通信安全,所以在使用 GitCafe 前你必须先建创自已的 SSH key。
(1). 进入 SSH 目录

root@fnngj-H24X:/home/fnngj/python/pyse# cd ~/.ssh
root@fnngj-H24X:~/.ssh# pwd
/root/.ssh

(2). 生成新的 SSH 秘钥
如果你已经有了一个秘钥(默认秘钥位置~/.ssh/id_rsa 文件存在)

root@fnngj-H24X:~/.ssh# ssh-keygen -t rsa -C "fnngj@126.com"
Generating public/private rsa key pair.
Enter file in which to save the key (/root/.ssh/id_rsa): --回车
Enter passphrase (empty for no passphrase): --回车
Enter same passphrase again: --回车
Your identification has been saved in /root/.ssh/id_rsa.
Your public key has been saved in /root/.ssh/id_rsa.pub.
The key fingerprint is:
3e:d5:1c:68:af:72:ef:4d:33:36:f9:84:5d:db:6d:17 fnngj@126.com
The key's randomart image is:
+--[ RSA 2048]----+
|        |
|       . |
|       o . |
|        . + . |
|        S . + E.|
|        . . . +*|
|       + o O.B|
|       + . + B.|
博客园---虫师
http://fnng.cnblogs.com 260
| .o . .|
+-----------------+
root@fnngj-H24X:~/.ssh# ls
id_rsa id_rsa.pub

查看目录下会生成两个问题,id_rsa 是私钥,id_rsa.pub 是公钥。记住千万不要把私钥文件 id_rsa透露给任何人。

3.添加 SSH 公钥到 GitCafe

(1). 用文本工具打开公钥文件 ~/.ssh/id_rsa.pub ,复制里面的所有内容到剪贴板。

(2). 进入 GitCafe -->账户设置–>SSH 公钥管理设置项,点击添加新公钥 按钮,在 Title 文本框中
输入任意字符,在 Key 文本框粘贴刚才复制的公钥字符串,按保存按钮完成操作。

4.测试连接

以上步骤完成后,你就可以通过以下命令来测试是否可以连接 GitCafe 服务器了。

root@fnngj-H24X:~/.ssh# ssh -T git@gitcafe.com
The authenticity of host 'gitcafe.com (117.79.146.98)' can't be established.
RSA key fingerprint is 84:9e:c9:8e:7f:36:28:08:7e:13:bf:43:12:74:11:4e.
Are you sure you want to continue connecting (yes/no)? yes
Warning: Permanently added 'gitcafe.com,117.79.146.98' (RSA) to the list of known hosts.
Hi fnngj! You've successfully authenticated, but GitCafe does not provide shell access.

第二节、提交代码

在 gitcafe 创建一个项目
注册并登陆 gitcafe ,选择创建一个项目。

项目创建完成:

Git 的基本命令:

root@fnngj-H24X:/home/fnngj/python/pyse# git
usage: git [--version] [--exec-path[=<path>]] [--html-path] [--man-path] [--info-path]
[-p|--paginate|--no-pager] [--no-replace-objects] [--bare]
[--git-dir=<path>] [--work-tree=<path>] [--namespace=<name>]
[-c name=value] [--help]
<command> [<args>]
最常用的 git 命令有:
add 添加文件内容至索引
bisect 通过二分查找定位引入 bug 的变更
branch 列出、创建或删除分支
checkout 检出一个分支或路径到工作区
clone 克隆一个版本库到一个新目录
commit 记录变更到版本库
diff 显示提交之间、提交和工作区之间等的差异
fetch 从另外一个版本库下载对象和引用
grep 输出和模式匹配的行
init 创建一个空的 git 版本库或者重新初始化一个
log 显示提交日志
merge 合并两个或更多开发历史
mv 移动或重命名一个文件、目录或符号链接
pull 获取并合并另外的版本库或一个本地分支
push 更新远程引用和相关的对象
rebase 本地提交转移至更新后的上游分支中
reset 重置当前 HEAD 到指定状态
rm 从工作区和索引中删除文件
show 显示各种类型的对象
status 显示工作区状态
tag 创建、列出、删除或校验一个 GPG 签名的 tag 对象
See 'git help <command>' for more information on a specific command.

全局设置:

设置自己的用户名和密码,和 gitcafe 保持一致:

root@fnngj-H24X:/home/fnngj/python/pyse# git config --global user.name 'fnngj'
root@fnngj-H24X:/home/fnngj/python/pyse# git config --global user.email 'fnngj@126.com'

(这一步必不可少!)
在本地创建一个项目:

root@fnngj-H24X:/home/fnngj/python/pyse# ls
baidu.py baidu.py~

创建 pyse 目录,在目录下创建了一个简单 python 自动化脚本 baidu.py

root@fnngj-H24X:/home/fnngj/python/pyse# git init
初始化空的 Git 版本库于 /home/fnngj/python/pyse/.git/

Git init 对我们的目录进行初始化。使 pyse 目录交由 git 进行管理。

root@fnngj-H24X:/home/fnngj/python/pyse# git status
# 位于分支 master
#
# 初始提交
#
# Untracked files:
# (使用 "git add <file>..." 以包含要提交的内容)
#
# baidu.py
# baidu.py~
nothing added to commit but untracked files present (use "git add" to track)

git status //查看当前项目下所有文的状态

我们看到当前处于 master (主)分支,罗列了当前目录下的文件(baidu.py),并且提示我未对当前目录下的文件进行跟踪(跟踪什么?跟踪文件增、删、改的情况。) ,更详细人告诉我可以通过 git add
来对文件进行跟踪。

root@fnngj-H24X:/home/fnngj/python/pyse# git add . root@fnngj-H24X:/home/fnngj/python/pyse# git status
# 位于分支 master
#
# 初始提交
#
# 要提交的变更:
# (使用 "git rm --cached <file>..." 撤出暂存区)
#
# 新文件: baidu.py
# 新文件: baidu.py~
#

git add . //(.)点表示当前目录下的所有内容,交给 git 管理,也就是提交到了 git 的本地仓库。当然我们我也可以通过 git add baidu.py 来制定具体跟踪的文件。 再来通过 git status 命令查看,
baidu.py 文件已经交给 git 跟踪了。

Commit 对提交内容做个描述:

root@fnngj-H24X:/home/fnngj/python/pyse# git commit -m 'first commit file'
[master (根提交) 06b5780] first commit file
2 files changed, 22 insertions(+)
create mode 100644 baidu.py
create mode 100644 baidu.py~root@fnngj-H24X:~/.ssh# ssh-keygen -t rsa -C "fnngj@126.com"
Generating public/private rsa key pair.
Enter file in which to save the key (/root/.ssh/id_rsa): --回车
Enter passphrase (empty for no passphrase): --回车
Enter same passphrase again: --回车
Your identification has been saved in /root/.ssh/id_rsa.
Your public key has been saved in /root/.ssh/id_rsa.pub.
The key fingerprint is:
3e:d5:1c:68:af:72:ef:4d:33:36:f9:84:5d:db:6d:17 fnngj@126.com
The key's randomart image is:
+--[ RSA 2048]----+
| |
| . |
| o . |
| . + . |
| S . + E.|
| . . . +*|
| + o O.B|
| + . + B.|
| .o . .|
+-----------------+
root@fnngj-H24X:~/.ssh# ls
id_rsa id_rsa.pub

在没次提交项目前都需要进行 commit ,对提交的内容加以描述。提示信息告诉我,我是在 master 下提交的2个新创建的文件,分别是 baidu.py 和 baidu.py~

下面将项目添加到 gitcafe 上去,还记得 gitcafe 创建的项目吧!?

root@fnngj-H24X:/home/fnngj/python/pyse# git remote add origin 'git@gitcafe.com:fnngj/pyse.git'
root@fnngj-H24X:/home/fnngj/python/pyse# git push -u origin master
Counting objects: 4, done.
Delta compression using up to 2 threads.
Compressing objects: 100% (4/4), done.
Writing objects: 100% (4/4), 436 bytes, done.
Total 4 (delta 1), reused 0 (delta 0)
To git@gitcafe.com:fnngj/pyse.git * [new branch] master -> master
Branch master set up to track remote branch master from origin.
git remote add origin 'git@gitcafe.com:fnngj/pyse.git'

/如果你是第一次提交项目,这一句非常重要,这是你本地的当前的项目与远程的哪个仓库建立连接。
git push -u origin master
//将本地的项目提交到远程仓库中。
OK!现在已经可以在 gitcafe 上看到我们创建的项目了!

第三节、更新代码

克隆代码

上面的代码编写与提交是我在公司完成的,假如我回到了家里想继续编写自己的程序,那么需要将代
码克隆下来。

Administrator@XP-201210141900 /d/selenium_use_case/python_selenium2
$ git clone git://gitcafe.com/fnngj/pyse.git
Cloning into 'pyse'...
remote: Counting objects: 7, done.
remote: Compressing objects: 100% (6/6), done.
remote: Total 7 (delta 1), reused 7 (delta 1)
Receiving objects: 100% (7/7), 262.60 KiB | 0 bytes/s, done.
Resolving deltas: 100% (1/1), done.
Checking connectivity... done.
Administrator@XP-201210141900 /d/selenium_use_case/python_selenium2
$ cd pyse
Administrator@XP-201210141900 /d/selenium_use_case/python_selenium2/pyse (master)
$ ls
baidu.py baidu.py~

git://gitcafe.com/fnngj/pyse.git 就是我们项目在 gitcafe 上的路径。通过 git clone 命令就可
以把项目克隆到本地。

更新提交

我们克隆文件到本地的目的是进一步地对代码进行修改并提交。

通过 git status 你会发现,我在 pyse 目录下做了比较大的改动,首先修改了 Gitcafehelpdoc.wps
文件,然后新增加了一些文件和文件夹。
去克隆一个项目很简单,提交一个项目比较麻烦。
因为我已经更新了环境(电脑),所以我需要再次在本机生成 ssh 公钥,并把生成的公钥添加到 gitcafe
中。具体步骤,参考前面的内容。

测试链接 ,设置全局变量:

Administrator@XP-201210141900 /d/selenium_use_case/python_selenium2/pyse (master)
$ ssh -T git@gitcafe.com
Hi fnngj! You've successfully authenticated, but GitCafe does not provide shell
access.
root@fnngj-H24X:/home/fnngj/python/pyse# git config --global user.name 'fnngj'
root@fnngj-H24X:/home/fnngj/python/pyse# git config --global user.email 'fnngj@126.com'

提交代码到 gitcafe

Administrator@XP-201210141900 /d/selenium_use_case/python_selenium2/pyse (master)
$ git add . ---添加当前目录下的所文件及文件夹
Administrator@XP-201210141900 /d/selenium_use_case/python_selenium2/pyse (master)
$ git commit -m "add test file and data and report" --对提交的内容进行说明
Administrator@XP-201210141900 /d/selenium_use_case/python_selenium2/pyse (master)
$ git push origin master --提交代码到远程服务器(gitcafe)
fatal: remote error: access denied or repository not exported: /fnngj/pyse.git
Administrator@XP-201210141900 /d/selenium_use_case/python_selenium2/pyse (master)
$ git remote -v
origin git://gitcafe.com/fnngj/pyse.git (fetch)
origin git://gitcafe.com/fnngj/pyse.git (push)

fatal: remote error: access denied or repository not exported: /fnngj/pyse.git

我们在 git push 的时候出问题了,告诉我不能与远程服务器链接。但是通过 git remote -v 查看
你当前项目远程连接的是的仓库地址是 OK 的呀!on,是这个地址有问题,这是一个 git 地址,我们只能用于克隆文件到本地,无法通有这个地址进行 push 项目。

git@gitcafe.com:fnngj/pyse.git
上面的地址才是一个可以 push 项目的地址。
那么我们就需要把 origin 删除掉,重新以上面的地址建立链接。

Administrator@XP-201210141900 /d/selenium_use_case/python_selenium2/pyse (master)
$ git remote rm origin --删除 origin
Administrator@XP-201210141900 /d/selenium_use_case/python_selenium2/pyse (master)
$ git remote add origin 'git@gitcafe.com:fnngj/pyse.git' --重新链接
Administrator@XP-201210141900 /d/selenium_use_case/python_selenium2/pyse (master)
$ git remote -v -- 现在的链接地址是可以 push
origin git@gitcafe.com:fnngj/pyse.git (fetch)
origin git@gitcafe.com:fnngj/pyse.git (push)
Administrator@XP-201210141900 /d/selenium_use_case/python_selenium2/pyse (master)
$ git push -u origin master --重新 push 项目
Counting objects: 24, done.
Delta compression using up to 8 threads.
Compressing objects: 100% (18/18), done.
Writing objects: 100% (22/22), 45.95 KiB | 0 bytes/s, done.
Total 22 (delta 2), reused 0 (delta 0)
To git@gitcafe.com:fnngj/pyse.git
427652a..efed4f4 master -> master
Branch master set up to track remote branch master from origin.

删除提交

在我 git 管理的目录下,有些文件或目录已经废弃掉了,我需要手动删除这些文件或目录,通过 git rm
命令来完成。

Administrator@XP-201210141900 /d/selenium_use_case/python_selenium2/pyse (master)
$ git rm baidu.py~ ---删除文件
rm 'baidu.py~'
$ git rm abc/ ---删除目录
rm 'abc'
Administrator@XP-201210141900 /d/selenium_use_case/python_selenium2/pyse (master)
$ git status
On branch master
Your branch is up-to-date with 'origin/master'.
Changes to be committed:
(use "git reset HEAD <file>..." to unstage)
deleted: baidu.py~ ---git 提示删除了 baidu.py~文件
Administrator@XP-201210141900 /d/selenium_use_case/python_selenium2/pyse (master)
$ git commit -m "delete baidu.py~"
Administrator@XP-201210141900 /d/selenium_use_case/python_selenium2/pyse (master)
$ git push origin master

pull 最新代码到本地

形成习惯,尽量为了避免冲突,我们在 push 代码之先把服务器端最新的代码 pull 到本地。

Administrator@XP-201210141900 /d/selenium_use_case/python_selenium2/pyse (master)
$ git pull origin master
From gitcafe.com:fnngj/pyse
* branch master -> FETCH_HEAD
Already up-to-date.

小结:

通过本节有学习,我们可以自由的随时随地提交自己的代码到服务器上,在多人开发项目中,我们会涉及到更多的技术,例如 git 的分支等。代码版本控制不是本书重点,笔者在这里更多的是起一抛砖引玉的作用,目前 git 的相关文档已经相当丰富了,读者可以进一步的学习。

主流的在线托管网站:
http://www.github.com/
http://git.oschina.net/
http://gitcd.com/

附录

UliPad–python 开发利器环境搭建

工欲善其事,必先利其器
有时候往往选择太多,变得无从选择。
如果你在 python 开发中已经找到了趁手的 IDE 这一节可以无视。
其实,pyhon 下面能找到一款不错的开发工具是不太容易的。IDLE 写写单个小程序很好,但一个程序文件与执行信息是两个窗口,程序开多了就分不清哪个了。
notepad++ 是一个小巧的万能编辑器。
linux 会有一些非常不错的交互式 python IDE ,如 ipython 、bpython 等。
vim 肯定是开发神器,但一般也只有高手才会运用自如,体会它的奥妙。
UliPad 是找到的写 python 最舒服的一个 IDE 。
地址:https://code.google.com/p/ulipad/

  • 免费,可以免费获得并使用它的所有功能。
  • 支持 windows 、MAC、linux 等平台。
  • 小巧,内存占用很少,10MB 左右。

具体,的安装使用,这里就不介绍了,不是本文档的主题。有兴趣使用可以参考我的博客:
http://www.cnblogs.com/fnng/p/3393275.html

Sublime–强大好用的代码编辑器

Sublime Text 是我发现的有一好用的编辑器,它不单单只支持 python ,几乎支持目前主流的语言,快捷键丰富,可以极大的提高代码开发效率。
Sublime Text 网址:
http://www.sublimetext.com/

下面介绍 sublime 的一些使用技巧,相信你掌握这些技巧之后一定会对它爱不释手。

sublime 使用技巧

两个小技巧:选择文字之后,按下 Tab 和 Shift + Tab 可以控制缩进。文件未保存就可以直接退出程序,下次启动会自动恢复。

一)在当前项目中,快速搜索文件

  1. 搜索文件

  1. 搜索文件小技巧,在输入文件路径的时候,可以/c/u/a/这样的格式匹配来快速找到文件

  1. 搜索到了2个结果,可以按上下键来在多个结果中跳转

二)添加注释

  1. 添加块注释,类似于/* */用这种方法来添加的注释一样。
    先选择要注释的内容,然后按 ctrl + /

  1. 添加行注释,把鼠标移到改行的任意位置,按 ctrl + /即可

  1. 取消单行注释,鼠标位于已经注释的行的任意位置,执行 ctrl + /即可

  1. 取消块注释
    选择要取消的内容,按 ctrl + / 即可


  1. 即取消注释和添加注释是逆操作

三) 快速跳转到指定的行

ctrl + g,然后输入行号,enter 就行。比如跳转到第五行。 或者 ctrl + p,再输入 :

四) 搜索函数

按 ctrl + r 或 ctrl + p ,在执行@。 之后填写要搜索的函数名

五) 隐藏菜单和显示菜单栏

  1. 隐藏菜单栏:view --> Hide Menu

  1. 隐藏菜单栏后,要显示菜单栏:
    i. 这是隐藏之后

  1. 隐藏之后显示菜单栏按住 Alt 键,菜单栏即会出现。松开后,则菜单栏就会消失。要永久显示则是: 按住 Alt 键–>view–> show Menu

主要快捷键列表
Ctrl+L 选择整行(按住-继续选择下行)
Ctrl+KK 从光标处删除至行尾
Ctrl+Shift+K 删除整行
Ctrl+Shift+D 复制光标所在整行,插入在该行之前
Ctrl+J 合并行(已选择需要合并的多行时)
Ctrl+KU 改为大写
Ctrl+KL 改为小写
Ctrl+D 选词 (按住-继续选择下个相同的字符串)
Ctrl+M 光标移动至括号内开始或结束的位置
Ctrl+Shift+M 选择括号内的内容(按住-继续选择父括号)
Ctrl+/ 注释整行(如已选择内容,同“Ctrl+Shift+/”效果)
Ctrl+Shift+/ 注释已选择内容
Ctrl+Z 撤销
Ctrl+Y 恢复撤销
Ctrl+M 光标跳至对应的括号
Alt+. 闭合当前标签
Ctrl+Shift+A 选择光标位置父标签对儿
Ctrl+Shift+[ 折叠代码
Ctrl+Shift+] 展开代码
Ctrl+KT 折叠属性
Ctrl+K0 展开所有
Ctrl+U 软撤销
Ctrl+T 词互换
Tab 缩进 自动完成
Shift+Tab 去除缩进
Ctrl+Shift+↑ 与上行互换
Ctrl+Shift+↓ 与下行互换
Ctrl+K Backspace 从光标处删除至行首
Ctrl+Enter 光标后插入行
Ctrl+Shift+Enter 光标前插入行
Ctrl+F2 设置书签
F2 下一个书签
Shift+F2 上一个书签

结语

本文转自——博客网:虫师
如果对大家学习软件测试能带来帮助,我很开心也很荣幸

未完待续

关注我,每天持续更新软件测试小知识
软件测试打卡交流聚集地点我,每天都有教学直播【暗号:CSDN】

【软件测试】自动化测试战零基础教程——Python自动化从入门到实战(完结)相关推荐

  1. 【软件测试】自动化测试战零基础教程——Python自动化从入门到实战(六)

    整理不易,希望对各位学习软件测试能带来帮助 软件测试知识持续更新 第五章 自动化测试用例设计 第一节.手工测试用例与自动化测试用例 手工测试用例与自动化测试用例对比: 用例选型注意事项: 第二节.测试 ...

  2. 【软件测试】自动化测试战零基础教程——Python自动化从入门到实战(一)

    第一章:自动化测试基础 第一节 软件测试分类 关于软件测试领域名词颇多,发现有许多测试新手混淆概念,从不同的角度可以将软件测试有不同的分类的方法:所以,这里汇总常见软件测试的相关名词,对软件测试领域有 ...

  3. 【软件测试】自动化测试战零基础教程——Python自动化从入门到实战(五)

    整理不易,希望对各位学习软件测试能带来帮助 第四章 自动化测试模型 一个自动化测试框架就是一个集成体系,在这一体系中包含测试功能的函数库.测试数据源.测试对象识别标准,以及种可重用的模块.自动化测试框 ...

  4. 【软件测试】自动化测试战零基础教程——Python自动化从入门到实战(八)

    整理不易,希望对各位学习软件测试能带来帮助 软件测试知识持续更新 第七章 引入测试报告与结构优化 第一节.生成 HTMLTestRunner 测试报告 第二节.测试套件 7.2.1.测试套件实例 7. ...

  5. 编程没基础学python多长时间--零基础学Python,从入门到精通需要多长时间

    求一份小甲鱼的<零基础入门学习Python>视频教程 评论 本系列教程面向础的同学,是一个深入浅通俗易懂的Python3视频教程. 适群 完全零基础入门,不需要任何前置知识. 教程概述 前 ...

  6. python从入门到精通需要多久--零基础学Python,从入门到精通需要多长时间

    求一份小甲鱼的<零基础入门学习Python>视频教程 评论 本系列教程面向础的同学,是一个深入浅通俗易懂的Python3视频教程. 适群 完全零基础入门,不需要任何前置知识. 教程概述 前 ...

  7. 零基础自学Python编程从入门到精通基础教程《从零开始学Python》

    推荐理由 本书面向零基础读者,巧用类比式描述,技术知识点轻松掌握: 基于案例进行讲解,读者可轻松理解编程思维,并在配套代码中参透Python编程的技巧. 本书囊括5项常见任务,助力快速掌握Python ...

  8. CrazyWing:Python自动化运维开发实战 六、流程控制

    Python 条件语句 Python条件语句是通过一条或多条语句的执行结果(True或者False)来决定执行的代码块. Python程序语言指定任何非0和非空(null)值为true,0 或者 nu ...

  9. python入门到精通需要学多久-廖雪峰python教程要学多久-零基础学Python需要多久...

    零基础学python大约需要多久 看不同的人,不同的学习能和基础. 像我通java,vc ,javascript,groovy,vb,c 接触过c#,delphi,asp,E语言, 用过dreamwa ...

最新文章

  1. Bhaskar Chowdhury: Kernel build failed ...SPHINX extension error
  2. Nginx 出現 500 Error 修復 (too many open file, connection)
  3. LaTeX 的对参考文献的处理
  4. rabbitMQ教程 spring整合rabbitMQ代码实例
  5. java开发文档怎么写_程序员该不该写技术文档,怎么写文档,易懂又能提升自己...
  6. emacs latex_如何使用Emacs创建LaTeX文档
  7. Oracle常用存储过程写法
  8. ca 自建 颁发证书_自建 ca 及使用 ca 颁发证书
  9. 制作U盘OS X安装盘
  10. Mysql + keepalived 实现双主热备读写分离
  11. Cadence OrCad Allegro SPB 16.6 下载及安装破解指南
  12. 《达芬奇密码》中的yinhui
  13. English gramer
  14. Codeforces C. Destroying Array
  15. 为什么要使用memcache?memcache有什么作用?
  16. HDU1799-组合公式变形
  17. Javescript第二周学习
  18. windows系统C盘“已用空间”不断增大
  19. 美国全国就业普遍低迷“技术”就业却加速增长;爱立信发布2030年10大消费者趋势 | 美通社头条...
  20. 超级终端之手机连接篇

热门文章

  1. 新建的windows服务器总是弹出 “Internet Explorer增强安全配置正在阻止来自下列网站的此应用程序中的内容“
  2. nginxWebUI
  3. 熊猫直播Rancho发布系统构建之路(二)
  4. 仅用一个HTML标签,实现带动画的抖音LOGO
  5. latex中插入表格
  6. java实现HTTP的POST协议的方法
  7. Redis的应用实例:关注和粉丝的 实现
  8. PLC编程时WORD和INT数据类型区分
  9. OPENPOSE人体姿态估计课程设计
  10. 8082端口占用 TIM搞事情