Table of contents
1. Test case design
Test the functionality, interface, compatibility, usability, security, and performance of the system.
2. Automated testing
Use the Unittes framework to test the login, view article details, and add article functions in the system, and generate a test report.
APIs commonly used by WebDriver:
from selenium import webdriver
import time
driver = webdriver.Chrome()
url = "http://124.222.237.227:8080/myblog/login.html"
driver.maximize_window()
time.sleep(3)
driver.get(url)
#用id来定位,登录
driver.find_element_by_id("username").send_keys("123")
driver.find_element_by_id("password").send_keys("123123123")
time.sleep(4)
driver.find_element_by_id("submit").click()
time.sleep(4)
#用xpath打开一篇文章
driver.find_element_by_xpath("//*[@id='artlist']/div[2]/div[4]/a[1]").click()
time.sleep(3)
# 浏览器后退
driver.back()
time.sleep(3)
#用link-text来定位
driver.find_element_by_link_text("首页").click()
time.sleep(4)
#用css_selector定位,进入首页
driver.find_element_by_css_selector("#pageDiv > a:nth-child(2)").click()
time.sleep(4)
#添加文章页面
driver.find_element_by_xpath("/html/body/div[1]/a[3]").click()
time.sleep(4)
#用xpath定位,进入首页
driver.find_element_by_xpath("/html/body/div[1]/a[1]").click()
time.sleep(3)
#退出
driver.find_element_by_id("islogin").click()
time.sleep(4)
driver.quit()
test case1 (unit test case):
from selenium import webdriver
import unittest
import time
from selenium.common.exceptions import NoAlertPresentException
import os
class testCase1(unittest.TestCase):
# 有setUp的部分,默认执行
def setUp(self):
self.driver = webdriver.Chrome()
self.url = "http://124.222.237.227:8080/myblog/login.html"
self.driver.get(self.url)
self.driver.maximize_window()
time.sleep(3)
# tearDown,在test_XXX方法执行完之后默认会调用
def tearDown(self):
self.driver.quit()
# 有test_XXX的部分,默认执行
# @unittest.skip("skipping")
def test_baidu1(self):
driver=self.driver
driver.find_element_by_id("username").send_keys("123")
driver.find_element_by_id("password").send_keys("123123123")
time.sleep(4)
driver.find_element_by_id("submit").click()
time.sleep(4)
driver.find_element_by_xpath("//*[@id='artlist']/div[2]/div[4]/a[1]").click()
time.sleep(3)
@unittest.skip("skipping")
def test_baidu2(self):
driver=self.driver
driver.find_element_by_id("username").send_keys("123")
driver.find_element_by_id("password").send_keys("123123123")
time.sleep(4)
driver.find_element_by_id("submit").click()
time.sleep(4)
driver.find_element_by_xpath("//*[@id='artlist']/div[2]/div[4]/a[1]").click()
time.sleep(3)
# 判断alert是否存在,可删除
def is_alert_exist(self):
try:
self.driver.switch_to.alert
except NoAlertPresentException as e:
return False
return True
if __name__=="__main__":
unittest.main(verbosity=0)
test case2 (unit test case):
from selenium import webdriver
import unittest
import time
from selenium.common.exceptions import NoAlertPresentException
import os
class testCase1(unittest.TestCase):
# 有setUp的部分,默认执行
def setUp(self):
self.driver = webdriver.Chrome()
self.url = "http://124.222.237.227:8080/myblog/login.html"
self.driver.get(self.url)
self.driver.maximize_window()
time.sleep(3)
# tearDown,在test_XXX方法执行完之后默认会调用
def tearDown(self):
self.driver.quit()
# 有test_XXX的部分,默认执行
# @unittest.skip("skipping")
def test_baidu1(self):
driver=self.driver
driver.find_element_by_id("username").send_keys("123")
driver.find_element_by_id("password").send_keys("123123123")
time.sleep(4)
driver.find_element_by_id("submit").click()
time.sleep(4)
driver.find_element_by_xpath("/html/body/div[1]/a[3]").click()
time.sleep(4)
@unittest.skip("skipping")
def test_baidu2(self):
driver=self.driver
driver.find_element_by_id("username").send_keys("123")
driver.find_element_by_id("password").send_keys("123123123")
time.sleep(4)
driver.find_element_by_id("submit").click()
time.sleep(4)
driver.find_element_by_xpath("//*[@id='artlist']/div[2]/div[4]/a[1]").click()
time.sleep(3)
# 判断alert是否存在,可删除
def is_alert_exist(self):
try:
self.driver.switch_to.alert
except NoAlertPresentException as e:
return False
return True
if __name__=="__main__":
unittest.main(verbosity=0)
test suite (a collection of unit test cases) && test runner (execute unit tests):
import unittest
from myblog import test112
from myblog import test113
def createSuite():
suite = unittest.TestSuite()
#suite.addTest(test001.testCase1("test_baidu1"))
#suite.addTest(test001.testCase1("test_baidu2"))
#suite.addTest(test003.testCase2("test_baidu1"))
#suite.addTest(test003.testCase2("test_baidu2"))
# makeSuite
#suite.addTest(unittest.makeSuite(test001.testCase1))
#suite.addTest(unittest.makeSuite(test003.testCase2))
#TestLoader
#suite1 = unittest.TestLoader.loadTestsFromTestCase(test001.testCase1)
#suite2 = unittest.TestLoader.loadTestsFromTestCase(test003.testCase2)
#suite.addTest([suite1,suite2])
# return suite
#最简便,把指定文件夹下,多有特定个事命名的脚本中类的所有以test开头的py文件
discover = unittest.defaultTestLoader.discover('../myblog',pattern='test11*.py',top_level_dir=None)
return discover
if __name__=="__main__":
suite = createSuite()
runner = unittest.TextTestRunner(verbosity=2)
runner.run(suite)
test report (generate test report):
import unittest
import time
from myblog import test112
from myblog import test113
import os,sys
import HTMLTestRunner
def createSuite():
discover = unittest.defaultTestLoader.discover('../myblog',pattern='test11*.py',top_level_dir=None)
print(discover)
return discover
if __name__=="__main__":
# 索取当前文件所在的文件路径
curpath = sys.path[0]
print(curpath)
if not os.path.exists(curpath + "/resultRepost"):
os.mkdir(curpath + "/resultReport")
now = time.strftime("%Y-%M-%d-%H %M %S",time.localtime(time.time()))
filename = curpath + "/resultReport/" + now +"-" + "resultReport.html"
with open(filename, 'wb') as fp:
runner = HTMLTestRunner.HTMLTestRunner(stream=fp,title=u"测试报告",description=u"用例执行的结果", verbosity=2)
suite =createSuite()
runner.run(suite)