用ABP只要加人即可马上加快项目进展(二) - 分工篇
- 前端蓬勃发展, 前后端分离是一个十分大的趋势.
- 专门的测试人员角色被取消, 多出了一个很重要的角色, 产品经理
- 分工协作和流水线作业工作效率会远远比传统的个人全能型先进很多, 这个道理很多同学都懂, 我就不赘述了.
- 前端快速和迅猛发展, 6个月发布一次大版本, 浏览器6周发布一次小版本, 导致传统程序员光是学习新技术就已经很吃力, 要谈精通更难了.请欣赏此图:
- 招人扩展团队加快项目进度更容易了!!! 这才是重点!!!流水线作业减低每个人的技术难度, 让招人和培训新手更容易招校招生上手难度降低, 更容易招聘和更快能够有产出招社招生更容易, 质量更高, 特别现在是前端爆发期
- 前后端一起定义接口
- 后端写好C# interfaces用Swagger生成接口文档
- 前端将后端写好的接口用refresh.bat生成前端ts proxy
- 前后端各自干各自的活
- TDD
- IOC/Mock
- Interface
- 前端根据产品经理写好的Specflow的.feature文件用cucumber写BDD代码
- 前后端一起定义接口和实现BDD的step definition代码
- 后端写好C# interfaces用Swagger生成接口文档
- 前端将后端写好的接口用refresh.bat生成前端ts proxy
- 前后端各自干各自的活
- 产品经理参与进来, 给开发人员写明了详细操作步骤级的测试结构代码.
- 开发人员不需要思考详细操作步骤, 只需要实现具体每个操作步骤.
- 每个操作步骤是独立分割的, 遇到项目紧急时, 通过临时调人加人来加快项目进度变得更可行.
- BDD与TDD相比, 天然的具备了结构性, 避免书写重复代码, 减少了测试代码的书写量.
- 很多公共的测试代码可以分割出来, 让专门的技术专家去写 (这会在后面一节里提到)
- 校招/美工/市场销售转过来的, 会用Axure等原型设计工具,这种情况应该由三个人结对编程写BDD.
- 测试人员改行的, 这种人写测试用例的能力就很容易很天然的演变为写BDD的能力
Talk is cheap, just show your code. 为了更形象的表现出产品经理有能力写BDD,我贴一个BDD .feature文件示例:
Feature: 登录
此文件包含登录成功和失败的例子 Scenario: 输入正确的用户名和密码能够正常登录
Given 我来到登录页面
When 输入用户名"admin"
And 输入密码"123qwe"
And 点击"登录"按钮
Then 跳转到首页 Scenario: 输入正确的用户名和错误的密码则登录失败
Given 我来到登录页面
When 输入用户名"admin"
And 输入密码"111111"
And 点击"登录"按钮
Then 依旧停留在登录页面
And 提示"用户名或密码错误" Scenario: 输入错误的用户名则登录失败
Given 我来到登录页面
When 输入用户名"admin"
And 输入密码"111111"
And 点击"登录"按钮
Then 依旧停留在登录页面
And 提示"用户名或密码错误" Scenario: 输入空的用户名则提示要输入空用户名
Given 我来到登录页面
And 点击"登录"按钮
Then 依旧停留在登录页面
And 提示"用户名必须填写" Scenario: 输入空的密码则提示要输入空密码
Given 我来到登录页面
When 输入密码"admin"
And 点击"登录"按钮
Then 依旧停留在登录页面
And 提示"密码必须填写"
从这个示例我们可以看到,除了少数几个大家都看得懂的英语单词外,全部都可以为中文,全部都可以为人类可以识别的语言,没有一行代码!不需要产品经理会写代码。
除了以上这个好处外,BDD在程序员方面还带来了天然的很良好的测试代码结构。让我们看一下示例:
using TechTalk.SpecFlow; namespace Bowling.SpecFlowXUnit.StepDefinitions
{
[Binding]
public sealed class 公用测试代码
{
[When(@"输入密码""(.*)""")]
public void When输入密码(string p0)
{
//ScenarioContext.Current.Pending();
//具体测试代码
} [Given(@"我来到登录页面")]
public void Given我来到登录页面()
{
//ScenarioContext.Current.Pending();
//具体测试代码
} [When(@"输入用户名""(.*)""")]
public void When输入用户名(string admin0)
{
//ScenarioContext.Current.Pending();
//具体测试代码
} [When(@"点击""(.*)""按钮")]
public void When点击按钮(string 登录0)
{
//ScenarioContext.Current.Pending();
//具体测试代码
} [Then(@"跳转到首页")]
public void Then跳转到首页()
{
//ScenarioContext.Current.Pending();
//具体测试代码
} [Then(@"依旧停留在登录页面")]
public void Then依旧停留在登录页面()
{
//ScenarioContext.Current.Pending();
//具体测试代码
} [Then(@"提示""(.*)""")]
public void Then提示(string 用户名或密码错误0)
{
//ScenarioContext.Current.Pending();
//具体测试代码
} [Given(@"点击""(.*)""按钮")]
public void Given点击按钮(string 登录0)
{
//ScenarioContext.Current.Pending();
//具体测试代码
}
}
}
从上面示例可以看到,以上代码结构都可以用Specflow自动生成,程序员不需要像TDD一样要自己去组织测试代码结构,这也是BDD优于TDD的很大一个特点。这里有个小秘诀,自动生成之后把Class Name全改为一致然后加上Partial关键字就可以有重复Step Definition会编译不通过提醒。
这系列文章是实战文章,所以不止止停留在理论上,在实际运用过程中会遇到各种问题。比如:
用ABP只要加人即可马上加快项目进展(二) - 分工篇的更多相关文章
- 如何用ABP框架快速完成项目(10) - ABP只要加人即可马上加快项目进展- 全栈篇(1) - 发挥DDD理论优势的时候到了!
正如我在<程序员英语二三事(2) - 从听开始>里说的, 任何技术/工具/语言都有其适用场景和上下文环境. DDD理论同样是如此. 现在, 终于到了发挥DDD理论优势的时候啦! 一 ...
- 如何用ABP框架快速完成项目(11) - ABP只要加人即可马上加快项目进展- 全栈篇(2) - 不推荐模块组件化, 推荐微服务
一个人写代码不需要担心会和别人的代码冲突, 不需要做代码合并, 不需要担心自己的代码被覆盖. 但是多个人一起写代码就需要担心这些问题. 解决这些问题的方法很多, 比如用AzureDevOps(TF ...
- HBase 中加盐之后的表如何读取:Spark 篇
在 <HBase 中加盐之后的表如何读取:协处理器篇> 文章中介绍了使用协处理器来查询加盐之后的表,本文将介绍第二种方法来实现相同的功能. 我们知道,HBase 为我们提供了 hbase- ...
- 高效能Windows人士的N个习惯之一:启动篇
接触电脑十多年,经历了各种折腾阶段,这几年开始沉静下来,不再追求花哨的界面与应用,只注重工作的效率,逐渐养成了一套自己的操作习惯,感觉不错,特撰文分享.标题借用了一下<高效能人士的七个习惯> ...
- 尝试从零开始构建我的商城 (一) :使用Abp vNext快速一个简单的商城项目
尝试从零开始构建我的商城 (一) :使用Abp vNext快速搭建一个简单的项目 前言 GitHub地址 https://github.com/yingpanwang/MyShop 此文目的 本文将尝 ...
- java连接数据库加载驱动到java项目
java连接数据库 package com.cook.zheng; import java.sql.Connection; import java.sql.DriverManager; public ...
- 关于加了hibernate 框架的项目启动特别慢的问题
今天突然遇到一个问题,就是加了hibernate 框架的项目在启动的时候,特别慢,竟然达到了4分多钟,查来查去,看到我的bean类里*.hbm.xml,有这样的写法: <?xml version ...
- 多人开发的git项目如何保持提交日志为一条直线?
多人开发的git项目如何保持提交日志为一条直线? 一.Git的项目的git常用操作 a)Git clone 项目地址 从远程仓库克隆项目到本地 b)Git pull 从当前分支拉取更新代码 c)Git ...
- ABP WebApi 加载错误
[TypeLoadException:类型'Abp.WebApi.Validation.AbpApiValidationFilter'中的方法'ExecuteActionFilterAsync'从程序 ...
随机推荐
- 应用监控CAT之cat-home源码阅读(三)
上两章从点到点讲了,cat-client 到 cat-consumer 的请求处理过程,但是怎么样让我们监控给人看到呢?那么就需要一个展示的后台了,也就是本章要讲的 cat-home 模块 ! 带 ...
- redis info 详解
# Server(服务器信息)redis_version:3.0.6 #redis服务器版本redis_git_sha1:00000000 ...
- Oracle列转行函数使用
一.业务场景 今天需要实现一个table,有一列的效果是:用户姓名A(账号a),用户姓名B(账号b)...这种格式.这就想到oracle的列转行函数vm_concat. 可以用类似这种格式wm_con ...
- C语言小笔记
头文件的书写 头文件实现函数声明,在使用模板后可以实现一个C文件中即使重复包含某个头文件,在系统中用于只会确认为一个包含 头文件包含可以理解为将头文件内容替换#include“...”行 模板(don ...
- 破解第二课 JMP法
首先,我用录屏大师自制了一个视频,给视频加上密码.任意输入,看到报错信息“密码不对,请重新输入” 第一步 反汇编窗口右键点击“中文搜索引擎”---“智能搜索”,搜索引擎界面再次搜索“不对”,结果如下: ...
- 如何使用Keras的Model visualization功能
问题 安装上graphviz和pydot之后调用出现如下问题 ['dot', '-Tpng', '/tmp/tmp1KPaiV'] return code: 1 stdout, stderr: War ...
- Mybatis解析mapper
众所周知,接口是不能被实例化的,但是日常开发中,我们经常能直接使用dao层对象的方法,这又是为什么呢. 带着这些问题,我们看下mybatis内部做了那些操作. Mapper解析 上文我们描述了myba ...
- java设计模式之——工厂模式
对于java的设计模式,我还是第一次认认真真的总结,以前用的时候都不曾留意细节,现在回头再看只知道该怎么设计,却忘记当时为嘛要用它了, 所以这次就做一个demo来再次复习总结一下,希望从中能学到新体悟 ...
- Linux常用命令之帮助和用户管理命令
目录 1.帮助命令 一.获得命令或配置文件帮助信息:man 二.获得shell内置命令的帮助信息:help 三.获得命令的中文帮助信息:--help 2.用户管理命令 一.添加新用户:useradd ...
- 记录学习新框架yii
最近打算提升自己的解决问题能力,于是打算从学习其他框架下手,让我们先去了解yii框架是如何运作的吧! https://www.yiichina.com/访问yii中文网站 让我们先把框架下载下来 点击 ...