├── .idea ├── Test-basis.iml └── vcs.xml ├── README.md ├── image ├── appium-desktop.png ├── appium-server.png ├── h模型.png ├── pip换源.png ├── v模型.png ├── w模型.png ├── x模型.png ├── 测试分类.png └── 软件缺陷产生的原因.png ├── python-appium └── py-appium.md ├── python-selenium └── py-selenium.md └── 测试基础知识 └── Test basis.md /.idea/Test-basis.iml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 12 | -------------------------------------------------------------------------------- /.idea/vcs.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | # Software-Test-Basis 2 | - 本项目主要总结本人所学的测试基础知识和一些自动化测试方向所使用的框架和工具 3 | ## 软件测试基本概念 4 | 5 | * [x] [软件测试基础](./测试基础知识/Test%20basis.md) 6 | 7 | ## python框架 8 | * [x] [python-selenium](./python-selenium/py-selenium.md) 9 | * [x] [python-appium](./python-appium/py-appium.md) 10 | * [ ] [unittest]() 11 | 12 | ## 自动化工具 13 | * [ ] [postman]() 14 | * [ ] [Fiddler]() 15 | * [ ] [jmeter]() -------------------------------------------------------------------------------- /image/appium-desktop.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/max-studio/Software-Test-Basis/ed52d697be19792e35337746e785a4a7d597872d/image/appium-desktop.png -------------------------------------------------------------------------------- /image/appium-server.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/max-studio/Software-Test-Basis/ed52d697be19792e35337746e785a4a7d597872d/image/appium-server.png -------------------------------------------------------------------------------- /image/h模型.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/max-studio/Software-Test-Basis/ed52d697be19792e35337746e785a4a7d597872d/image/h模型.png -------------------------------------------------------------------------------- /image/pip换源.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/max-studio/Software-Test-Basis/ed52d697be19792e35337746e785a4a7d597872d/image/pip换源.png -------------------------------------------------------------------------------- /image/v模型.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/max-studio/Software-Test-Basis/ed52d697be19792e35337746e785a4a7d597872d/image/v模型.png -------------------------------------------------------------------------------- /image/w模型.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/max-studio/Software-Test-Basis/ed52d697be19792e35337746e785a4a7d597872d/image/w模型.png -------------------------------------------------------------------------------- /image/x模型.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/max-studio/Software-Test-Basis/ed52d697be19792e35337746e785a4a7d597872d/image/x模型.png -------------------------------------------------------------------------------- /image/测试分类.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/max-studio/Software-Test-Basis/ed52d697be19792e35337746e785a4a7d597872d/image/测试分类.png -------------------------------------------------------------------------------- /image/软件缺陷产生的原因.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/max-studio/Software-Test-Basis/ed52d697be19792e35337746e785a4a7d597872d/image/软件缺陷产生的原因.png -------------------------------------------------------------------------------- /python-appium/py-appium.md: -------------------------------------------------------------------------------- 1 | # appium 基础应用 2 | > 注意:appium是安卓app测试,请自行将安装环境配置好,这里不再另外说明安卓环境。 3 | ### 准备工作 4 | - 安装appium 5 | > 建议安装Appium-Desktop版本,Appium-server版本已经停止更新。 6 | - Appium-Desktop下载:[appium-desktop](https://github.com/appium/appium-desktop/releases)
7 | ![下载提示](../image/appium-desktop.png) 8 | - Appium-server下载:[appium-server](https://bitbucket.org/appium/appium.app/downloads/)
9 | ![下载提示](../image/appium-server.png) 10 | 11 | - 安装Appium-Python-Client
12 | 进入cmd,输入一下代码: 13 | ```pip install Appium-Python-Client``` 14 | >如果遇到遇到下载缓慢的问题,可以将pip的下载源更换为国内的镜像网站,推荐使用清华大学的镜像站。 15 | 更换方法为:在你的c盘下user(用户)文件夹里的用户名(自己取的名字)文件夹下新建一个pip文件,在pip文件夹下新建pip.ini文件并在文件中写入下面的内容:
16 | \[global]
17 | index-url = https://pypi.tuna.tsinghua.edu.cn/simple
18 | 即可。 19 | 20 | ![图片提示](../image/pip换源.png) 21 | 22 | ### appium基础语法 23 | - 初始化语句 24 | ```python 25 | from appium import webdriver 26 | desired_caps={ 27 | "platformName":"Android", 28 | "platformVersion":"8.0", # 安卓版本 29 | "deviceName":"Android Emulator", #此参数填自己的设备名 30 | "unicodeKeyboard":True,#使用unicode编码发送 31 | "resetKeyboard":True,#隐藏键盘,主要解决中文输入问题。 32 | # appPackage和appActivity根据具体要测试的app填写包名和活动。 33 | "appPackage":"??", 34 | "appActivity":"??", 35 | "reset":"noreset", 36 | } 37 | driver = webdriver.Remote('http://localhost:4723/wd/hub', desired_caps)# 启动appium 38 | ``` 39 | - 操作语句 40 | - 操作语句基本上与selenium的操作语句一样。 41 | ``` 42 | driver.find_element_by_id().click() # 通过id查找,并使用click方法点击 43 | driver.find_element_by_id().send_keys() #查找并输入测试数据 44 | ``` 45 | 46 | 以下介绍与selenium不一样的API 47 | 48 | - 获取元素坐标 49 | `x.location` 50 | - 获取当前app的包名和启动名 51 | `current_package` `current_activity` 52 | - 滑动事件 53 | - 利用坐标滑动 54 | `swip(start_x, start_y, end_x, end_y, duration=None)` 55 | - 利用元素滑动 56 | `scroll(start_ele, end_ele)` 57 | >start_x:开始横坐标,start_y:开始纵坐标,end_x:结束横坐标,end_y:结束纵坐标,duration:持续时间;
58 | start_ele:开始元素,end_ele:结束元素 59 | 60 | - 拖拽事件 61 | `drag_and_drop(start_ele, end_ele)` 62 | 63 | - 应用后台运行 64 | `background_app(seconds)` 65 | 66 | - 手势动作事件 67 | - 点击动作`tap` 68 | -------------------------------------------------------------------------------- /python-selenium/py-selenium.md: -------------------------------------------------------------------------------- 1 | # selenium基础应用 2 | 3 | ### 准备工作 4 | -安装selenium
5 | 首先,下载selenium库
6 | ```pip install selenium```
7 | 8 | 之后导入selenium库,检查是否下载成功。 9 | ``` 10 | import selenium 11 | ``` 12 | 13 | - 安装浏览器驱动
14 | Selenium调用浏览器必须有一个webdriver驱动文件。 15 | 1. Chrome驱动文件下载:[chromedriver](https://chromedriver.storage.googleapis.com/index.html?path=2.35/) 16 | 2. Firefox驱动文件下载:[geckodriver](https://github.com/mozilla/geckodriver/releases) 17 | 18 | Chrome版本与chromedriver版本对照及下载: 19 | 20 | 21 | chromedirve版本|chrome版本 22 | ----|---- 23 | ChromeDriver v2.46 (2019-02-01) | Chrome v71-73 24 | ChromeDriver v2.45 (2018-12-10) | Chrome v70-72 25 | ChromeDriver v2.44 (2018-11-19) | Chrome v69-71 26 | ChromeDriver v2.43 (2018-10-16) | Chrome v69-71 27 | ChromeDriver v2.42 (2018-09-13) | Chrome v68-70 28 | ChromeDriver v2.41 (2018-07-27) | Chrome v67-69 29 | ChromeDriver v2.40 (2018-06-07) | Chrome v66-68 30 | ChromeDriver v2.39 (2018-05-30) | Chrome v66-68 31 | ChromeDriver v2.38 (2018-04-17) | Chrome v65-67 32 | ChromeDriver v2.37 (2018-03-16) | Chrome v64-66 33 | ChromeDriver v2.36 (2018-03-02) | Chrome v63-65 34 | ChromeDriver v2.35 (2018-01-10) | Chrome v62-64 35 | 36 | > 下载的浏览器驱动请放在python安装目录下。如果放在其他目录下,请自行配环境。 37 | 38 | ### selenium的定位方式 39 | 40 | - selenium提供了8钟定位方式 41 | - id 42 | - name 43 | - class name 44 | - tag name 45 | - link text 46 | - partial link text 47 | - xpath 48 | - css selector 49 | - 8种定位的python方法 50 | 51 | 定位一个元素 | 定位多个元素 | 含义 52 | ---- | ---- | ---- 53 | find_element_by_id() | find_elements_by_id() | 使用元素id定位 54 | find_element_by_name() | find_elements_by_name() | 使用元素名字定位 55 | find_element_by_class_name() | find_elements_by_class_name() | 使用元素类名定位 56 | find_element_by_tag_name() | find_elements_by_tag_name() | 使用标签定位 57 | find_element_by_link_text() | find_elements_by_link_text() | 使用完整链接定位 58 | find_element_by_partial_link_text() | find_elements_by_partial_link_text() | 使用部分链接定位 59 | find_element_by_xpath() | find_elements_by_xpath() | 使用元素xpath路径定位 60 | find_element_by_css_selector() | find_elements_by_css_selector() | 使用css选择器定位 61 | 62 | - 举个栗子 63 | 64 | 以百度首页为例子. 65 | ``` 66 | from selenium import webdriver 67 | driver = webdriver.Chrome() 68 | # 以下都是查找搜索框 69 | driver.find_element_by_id('kw') 70 | driver.find_element_by_class_name('s_ipt') 71 | driver.find_element_by_name('wd') 72 | driver.find_element_by_xpath('//*[@id="kw"]') 73 | # 以下是查找百度一下按钮 74 | driver.find_element_by_css_selector('#su') 75 | ``` 76 | 77 | 78 | ### 控制浏览器的一些方法 79 | 80 | 方法 | 含义 81 | ---- |--- 82 | set_window_size() | 设置浏览器大小 83 | back() | 浏览器后退 84 | forward() | 浏览器前进 85 | refresh() | 刷新当前页 86 | clear() | 清除文本 87 | send_keys(value) | 模拟按键输入 88 | click() | 单击元素 89 | submit() | 用于提交表单 90 | get_attribute(name) | 获取元素属性 91 | is_displayed() | 设置该元素是否用户可见 92 | size | 返回元素的尺寸 93 | text | 获取元素的文本 94 | 95 | ### 鼠标事件 96 | 需要导入ActionChains类 97 | ``` 98 | from selenium.webdriver import ActionChains 99 | ``` 100 | 101 | 方法 | 说明 102 | ----| ---- 103 | ActionChains(driver) | 构造ActionChains对象 104 | click() | 单击 105 | double_click() | 双击 106 | context_click() | 右击 107 | move_to_element(above) | 执行鼠标悬停操作 108 | drag_and_drop(source,target) | 拖动 109 | drag_and_drop_by_offset(source,x,y) | 拖动到某个坐标后松开 110 | perform() | 执行所有 ActionChains 中存储的行为,可以理解成是对整个操作的提交动作 111 | 112 | ### 键盘事件 113 | 需要导入Keys类 114 | ``` 115 | from selenium.webdriver.common.keys import Keys 116 | ``` 117 | 118 | 方法|说明 119 | ---|--- 120 | send_keys(Keys.BACK_SPACE)|删除键 121 | send_keys(Keys.SPACE)|空格键 122 | send_keys(Keys.TAB)|制表键 123 | send_keys(Keys.ESCAPE)|回退键 124 | send_keys(Keys.ENTER)|回车键 125 | send_keys(Keys.CONTROL,'a')|全选ctrl+a 126 | send_keys(Keys.CONTROL,'c')|复制ctrl+c 127 | send_keys(Keys.F1)|F1 128 | ……|…… 129 | send_keys(Keys.F12)|F12 130 | 131 | 132 | ### expected_conditions EC 133 | 134 | `判断一个元素是否存在,如判断alert弹窗等` 135 | 136 | 方法 | 说明 137 | ----| ---- 138 | title_is | 判断当前页面的title是否完全等于预期字符串 139 | title_contains | 判断当前页面的title是否包含预期字符串 140 | presence_of_element_located | 元素存不存在这个页面(是否存在于dom树中) 141 | visibility_of_element_located | 判断某个元素是否可见 142 | visibility_of | 判断某个元素是否可见,直接传定位到的element 143 | presence_of_all_elements_located | 判断是否至少有1个元素存在于dom树中 144 | text_to_be_present_in_element | 判断某个元素中的text是否包含了预期的字符串 145 | text_to_be_present_in_element_value | 判断某个元素中的value属性是否包含了预期的字符串 146 | frame_to_be_available_and_switch_to_it | 判断该frame是否可以switch进去,如果可以的话,返回True并且switch进去,否则返回False 147 | invisibility_of_element_located | 判断某个元素中是否不存在于dom树或不可见 148 | element_to_be_clickable | 判断某个元素中是否可见并且是enable的 149 | staleness_of | 等某个元素从dom树中移除 150 | element_to_be_selected | 判断某个元素是否被选中了,一般用在下拉列表 151 | element_selection_state_to_be | 判断某个元素的选中状态是否符合预期 152 | element_located_selection_state_to_be | 判断某个元素的选中状态是否符合预期,传入定位到的locator 153 | alert_is_present | 判断页面上是否存在alert 154 | 155 | 156 | ###等待 157 | 等待分为显式等待和隐式等待(推荐使用显示等待,能够缩短运行时间)
158 | 显式等待是等待某个条件成立则继续执行,否则在达到最大等待时间就会抛出异常。 159 | ``` 160 | WebDriverWait(driver,timeout,poll_frequency=0.5,ignored_exception=None) 161 | ``` 162 | >driver:浏览器驱动
163 | timeout: 最长超时时间,默认为秒
164 | poll_frequency:检测的间隔时间,默认为0.5s
165 | ignored_exception:超时后的异常信息,默认抛出NoSuchElementException异常 166 | 167 | WebDriverWait一般和until()或until_not()
168 | ``` 169 | until(method,message='') 170 | until_not(method,message='') 171 | ``` 172 | 隐式等待会等待页面上所有的元素,当脚本执行到某个元素定位时,如果元素存在,则继续,不存在则以轮询的方式不断的判断元素是否存在,直到超出设定时间,抛出异常。 173 | ``` 174 | implicitly_wait() 175 | ``` 176 | 177 | ###多表单切换 178 | 在网页中,有可能会遇见frame/iframe表单嵌套的应用,这时需要通过`switch_to.frame()`方法,将当前定位主体切换到 179 | 表单内。使用`switch_to.default_content()`回到外层页面。 180 | 181 | ###下拉框 182 | 在网页中,如果遇见有下拉框的元素时,就需要使用Select类来定位