博客目录html
在正式发布前,为检验后端各接口功能的正确性,后端服务器对压力的耐受程度,以及前端各页面、功能的运行状况,咱们对咱们的服务器及小程序进行了多种测试。除去随开发进行的基本正确性测试外,针对上述三种情形,咱们分别进行了单元测试、压力测试以及功能测试。前端
单元测试的主要目的,是测试后端全部接口的工做是否正常。其内容主要包含两方面:
- 接口在正常状况下是否能发挥预期功能
- 接口在异常状况下是否能返回预期错误信息python
Beta阶段的全部单元测试与Alpha阶段相同,在pycharm下使用Coverage工具进行测试。通过修改后已经经过了全部单元测试。所进行的一些测试以下图:
ios
为保证测试的全面性,咱们针对每个接口都设计了相应的单元测试。单元测试的总数高达140个。
在运行完全部单元测试后,单元测试的代码覆盖率高达96%,切实确保了全部接口的正确性。
算法
单元测试中发现的bug以下:数据库
接口 | 现象 | 缘由 | 是否解决 |
---|---|---|---|
p/<int:post_id>/modify/ |
发送正确信息时会返回错误3,但发送携带错误label的信息时会正常返回 | 对label的合法性判断条件反了 | 是 |
f/processing/<str:label>/ |
发送错误label是仍能正常返回 | 检验label时调用相应检验函数时未将label分隔成数组传入 | 是 |
my/<int:user_id>/apply/ |
不管发送什么信息都会报错 | 错误的调用了推荐算法 | 是 |
f/processing/ |
没法获取发布信息 | 经过后台管理界面增长数据时没有指定发帖人,致使获取信息时崩溃 | 是 |
f/processing/ |
history参数为空时报错 | 对空字符串调用split方法并不会获得一个空列表 | 是 |
login/wechat/ |
微信登陆接口没法获取openid | 腾讯提供的auth.code2Session接口返回值与文档不一致 | 是 |
login/wechat/ |
改用MySQL数据库后含有特殊字符的微信昵称没法登录 | MySQL数据库的默认编码问题,须要将编码改成utf8mb4 | 是 |
p/<int:post_id>/delete/ |
删除post后与该post相关的apply并未删除 | 相关的apply须要手动删除或者将对应的外键参数on_delete设置为models.CASCADE | 是 |
c/post/ |
post_title字段超过20个字符时没法建立post | 先后端约定不一致,后端限制最大长度为20,而前端为50 | 是 |
服务器端设置的默认图片路径没法访问 | 在Windows系统上能够将默认图片路径设为绝对路径,但在ubuntu系统上彷佛只能用相路径 | 是 | |
微信机器人没法正常登录 | 没有将以前运行生成的wxpy.pkl删除 | 是 |
能够看见,大部分bug产生的缘由仍是参数的合法性问题。上述问题现已所有解决。json
对服务器来讲,压力负载能力是评价其表现的重要指标之一。所以,咱们针对服务器进行了压力测试。
压力测试使用基于Python的压力测试工具locust进行。压力测试的一些基本参数以下:ubuntu
进行压力测试后的结果以下:
能够看到,对于上述参数下的压力测试,总请求数量为5412个的状况下,失败请求数为3,表现良好。
平均响应时间为1.539s,做为高峰期的响应时间,仍能够接受。
吞吐率为17.4req/s。
在压力测试结束时,针对云服务器端的监控以下:
在途中能够看到,在压力测试期间,CPU的占用率峰值约在62%左右,仍有必定资源剩余。可是,在监控图的第一行外网出带宽
中能够看到,压力测试期间的对外带宽达到了最大限制1Mbps,所以,能够发现性能的瓶颈主要在于云服务器的带宽限制(1Mbps)。小程序
对于前端的功能测试,仍采用与Alpha阶段相同的方式,即在不一样的机型、不一样的操做系统下,对每一个页面的每一个功能进行一一测试,以检测其功能的正确性。前端功能测试的测试矩阵以下:后端
测试矩阵 | 功能测试 | 页面显示 | ||||||||||||
---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
测试机型 | 测试环境 | 登陆 | 搜索 | 查看分类标签 | 首页智能推荐 | 修改我的信息 | 修改简历 | 查看招募 | 发布招募 | 查看个人发布 | 采纳申请 | 申请招募 | 查看个人申请 | 页面排版 |
Mi5 | Android 8.0 wifi | 无问题 | 无问题 | 无问题 | 无推荐效果 | 后端问题致使没法修改 | 无问题 | 无问题 | 无问题 | 无问题 | 没法查看申请者 | 无问题 | 查看个人简历没法显示 | 无问题 |
Mi6 | Android 9.0 wifi | 无问题 | 无问题 | 无问题 | 无推荐效果 | 后端问题致使没法修改 | 无问题 | 无问题 | 无问题 | 无问题 | 没法查看申请者 | 无问题 | 查看个人简历没法显示 | 无问题 |
Mi9 | Android 9.0 wifi | 无问题 | 无问题 | 无问题 | 无推荐效果 | 后端问题致使没法修改 | 无问题 | 无问题 | 无问题 | 无问题 | 没法查看申请者 | 无问题 | 查看个人简历没法显示 | 无问题 |
iphonoe xr | ios12 | 第一次须要退出重进 | 无问题 | 无问题 | 无推荐效果 | 后端问题致使没法修改 | 无问题 | 无问题 | 无问题 | 无问题 | 没法查看申请者 | 无问题 | 查看个人简历没法显示 | 无问题 |
iphonoe 8 | ios12 | 第一次须要退出重进 | 无问题 | 无问题 | 无推荐效果 | 后端问题致使没法修改 | 无问题 | 无问题 | 无问题 | 标签选择时偶然产生失去焦点问题 | 无问题 | 无问题 | 查看个人简历没法显示 | 无问题 |
华为荣耀 | 安卓 8.0 | 第一次须要退出重进 | 无问题 | 无问题 | 无推荐效果 | 后端问题致使没法修改 | 无问题 | 无问题 | 无问题 | 标签选择时偶然产生失去焦点问题 | 无问题 | 无问题 | 无问题 | 无问题 |
BUG | 现象 | 缘由 | 是否解决 |
---|---|---|---|
标签页下拉菜单显示异常 | 输入刚一结束,还未选择标签,下拉菜单页消失 | 控件绑定函数的触发事件有问题 | 是 |
当用户没有标签时,修改发布页面崩溃 | 页面没法正常显示信息 | 当没有标签的时候,标签以前无分隔符,调用分割函数时报错 | 是 |
我的中心个人简历页面退出登录有误 | 退出到了一个不用的界面 | 上个版本遗漏的bug,现已经解决 | 是 |
待审核简历数有误 | 一直显示同一个数字 | 前端设计页面时设置的默认变量未更换 | 是 |
申请招募时,对简历合法性检测出问题 | 输入合法的简历信息可是没法提交申请 | 判断简历信息是否合法的信息出了问题 | 是 |
获取头像后没法当即登陆 | 点击获取头像之后无反应而后没法登录 | 获取用户信息与登录功能交叉 | 否 |
无推荐效果 | 主页页面不会随用户点击而变 | 推荐算法不完善,帖子数目太少 | 否 |
后端问题,没法修改我的信息 | 后端检查格式问题 | 后端检查错误 | 否 |
没法查看申请者 | 点击查看申请者无反馈结果 | 缘由未知 | 否 |
查看个人简历没法显示 | IOS上没法显示简历 | 安卓和ios 数据不互通 | 否 |
主页有时候加载不出来 | 加载提示结束时未显示主页面 | 缘由未知 | 否 |
没法查看申请者简历 | 点击申请者没法显示简历 | 缘由未知 | 否 |
对于前端的回归测试,咱们在测试前端功能时,对全部新旧页面都进行了一一测试,确保了原有功能的正确性(详情见测试矩阵)。
对于后端的回归测试,咱们随着开发,更新了上一阶段的单元测试,对于有改动的接口,修改了其相应的单元测试使其知足最新功能。下面给出一个原有接口的单元测试用例代码:
class GetApplyTest(TestCase): def setUp(self): # 测试所用数据库为空,需手动插入数据 user = User.objects.create(account='bsh_test', password=gen_md5('admin_admin', SECRET_KEY)) # 数据库中插入用户 self.post2 = Post.objects.create(title="test_apply", post_detail="test_test2", request_num=4, accept_num=1, deadline="2019-5-20", if_end=False, poster=user) resume = Resume.objects.create(name='asd', sex='s', age=10, degree='dasd', phone='1234', email='1@2', city='32', edu_exp='bei', awards='das', english_skill='dasd', project_exp='dasda', self_review='dasd') self.apply_exp = Apply.objects.create(resume=resume, post=self.post2, applicant=user) self.token = create_token(user.id).decode() self.url = '/apply/' + str(self.apply_exp.id) + '/' self.post_ID = self.post2.id def test_get_apply(self): ''' 成功获取 ''' response = self.client.get(self.url, HTTP_AUTHORIZATION=self.token) ret_data = response.json() self.assertTrue(ret_data['ret']) # self.assertEqual(ret_data['error_code'], 3) def test_get_apply_err1(self): ''' 不是 get 方法 ''' response = self.client.post(self.url, HTTP_AUTHORIZATION=self.token, content_type='application/json') ret_data = response.json() self.assertFalse(ret_data['ret']) self.assertEqual(ret_data['error_code'], 1) def test_get_apply_err2(self): ''' 用户登录已过时 ''' response = self.client.get(self.url, HTTP_AUTHORIZATION='') ret_data = response.json() self.assertFalse(ret_data['ret']) self.assertEqual(ret_data['error_code'], 5) def test_get_apply_err3(self): ''' 该申请不存在 ''' uuu = '/apply/666/' response = self.client.get(uuu, HTTP_AUTHORIZATION=self.token) ret_data = response.json() self.assertFalse(ret_data['ret']) self.assertEqual(ret_data['error_code'], 2) def test_get_apply_err4(self): ''' 当前登录的用户 既不是申请者 也不是发布者 ''' user_a = User.objects.create(account='bsh_adsad', password=gen_md5('admin_admin', SECRET_KEY)) tt = create_token(user_a.id).decode() response = self.client.get(self.url, HTTP_AUTHORIZATION=tt) ret_data = response.json() self.assertFalse(ret_data['ret']) self.assertEqual(ret_data['error_code'], 3)
该单元测试类GetApplyTest
对应的接口设计规格以下:
setUp
方法:setUp
方法用于填充用于测试的数据。测试所用数据库与实际后台服务器数据库是分离的,每次运行测试时,测试数据库都为空,所以须要先向测试数据库中填充测试所须要的数据。此方法中还用于初始化一些其余测试经常使用的变量,如用户token
,访问的后端url
等。test_get_apply
方法:
test_get_apply
方法用于测试正常获取到该申请的状况。在这种状况下,返回值ret_data
的值应为true
。
test_get_apply_error1
方法:
test_get_apply_error1
方法测试的是error_code
为1,即前端访问该url时,请求类型不是get
的状况。判断返回的ret_data
是否为false
,返回的错误代码error_code
是否为1,做为测试的正确性判断。
test_get_apply_error2
方法:
test_get_apply_error2
方法测试的是error_code
为5,即前端访问该url时,用户登陆已过时,未能获取到token
的状况。一样判断返回的ret_data
是否为false
,返回的错误代码error_code
是否为5。
test_get_apply_error3
方法:
test_get_apply_error3
方法测试的是error_code
为2,即前端访问该url时,给出的apply_id
不存在的状况。这种状况返回的错误代码error_code
应为2。
test_get_apply_error4
方法:
test_get_apply_error4
方法测试的是error_code
为3,即前端访问该url时,当前用户既不是该申请的发布者或接受者,即用户没有权限查看该申请的状况。返回错误代码error_code
应为3。
Beta版本主要进行的工做是页面的从新设计以及实现,所以,出口条件设定以下: