什么是TestNG

TestNG是一套开源测试框架,是从JUnit继承而来,TestNG意为test next generation。它的优势如下:

  • 支持注解。
  • 可以在任意的大线程池中,使用各种策略运行测试(所有方法都可以拥有自己的线程或者每个测试类拥有一个线程等等)。
  • 代码多线程安全测试。
  • 灵活的测试配置。
  • 支持数据驱动测试(@DataProvider)。
  • 支持参数。
  • 强大的执行模型(不再用TestSuite)。
  • 支持各种工具和插件(Eclipse、IDEA、Maven等)。
  • 可以更灵活地嵌入BeanShell。
  • 默认JDK运行时功能和日志记录(无依赖关系)。
  • 依赖应用服务测试的方式。

TestNG的最简单示例

我们先来看一个TestNG最简单的示例:

import org.junit.AfterClass;
import org.junit.BeforeClass;
import org.testng.annotations.Test;

public class HelloWorld {

@BeforeClass
public void beforeClass() {
System.out.println("this is before class");
}

@Test
public void TestHelloWorld() {
System.out.println("this is HelloWorld test case");
}

@AfterClass
public void afterClass() {
System.out.println("this is after class");
}
}

从面上的简单示例中可以看出TestNG的生命周期,并且可以看到TestNG是使用注解来控制生命周期的。下面我们来看看TestNG支持的各种注解。

TestNG的注解

TestNG的注解大部分用在方法级别上,一共有六大类注解。

Before类别和After类别注解

  • @BeforeSuite:被注解的方法将会在所有测试类执行之前运行。
  • @AfterSuite:被注解的方法将会在所有测试类执行之后运行。
  • @BeforeTest:被注解的方法将会在当前测试类中的所有测试方法执行之前运行。
  • @AfterTest:被注解的方法将会在当前测试类中的所有测试方法执行之后运行。
  • @BeforeClass:被注解的方法将会在当前测试类中的第一个测试方法执行之前运行。
  • @AfterClass:被注解的方法将会在当前测试类中的最后一个测试方法执行之后运行。
  • @BeforeMethod:被注解的方法将会在当前测试类中的每个测试方法执行之前运行。
  • @AfterMethod:被注解的方法将会在当前测试类中的每个测试方法执行之后运行。
    我们可以根据不同的场景来使用不同的注解。
閱讀全文 »

Google是一个伟大的公司,有很多伟大的产品。从Google一直不做桌面系统和对Chrome的大力发展来看,Google对前端事业是非常热衷的。

Angular

Angular、React、Vue是目前前端框架的三驾马车。我在16年9月写过一篇文章《温故而知新-AngularJS 1.x 小记》,当时还叫AngularJS,版本是1.X,那时已经很惊艳了,把前端解释性的脚本语言封装成了面向对象的编程模式,另外对HTML的元素维护提供了便利的方式方法。当时我负责的BPM产品,Process Builder的前端架构果断更新为了AngularJS。时隔两年多,Angular 6都已经发布了,如果我还有机会做前端产品的话,我应该还是会果断选择Angular。

Angular 6 添加了ng update和ng add这样的新功能,让你的应用程序保持最新的状态,帮助Angular开发者加快创新的步伐。渲染器Project Ivy也有很大的改进,它能使Angular调试更容易,以更快地速度编译和运行,它还可以与现有的应用程序一起使用,Angular团队还在小型Hello World应用程序做了演示,不使用的Angular功能将自动从应用的JavaScript bundle自动删除。

PWA

在移动的世界里,Application是重中之重,是构建移动生态的核心。那么构建Mobile App的方式的问题就来了。

  • Native App:既用iOS的原生语言OC、Swift或Android原生语言Java构建的App。
  • Web App:既使用前端框架和技术(Angular、React、Vue,HTML 5,CSS 3等)构建的,在移动设备上运行展现的App。
  • Native & Web App:原生语言和Web技术混搭构建的App。这类App还孕育出了像React Native这种使用前端语言解析为原生语言的框架。

以上三种类型各有利弊:

  • Native App给用户的体验是最好的,交互动画效果平滑,可以基于硬件的性能做优化等。但是研发周期比较长,并且因为iOS和Android应用的审核机制,导致版本更新周期比较长,修复完问题或有新需求增加后无法做到及时更系用户设备上的App。
  • Web App可以做到版本的热更新,研发周期短,Web端和移动端可共享研发资源。但是用户体验比较差,一些需要使用到硬件功能不好实现。
  • Native & Web App则致力于综合他们的优点,规避他们的缺点。

Progressive Web App(PWA)就是Google推出的提升Web App体验,给用户原生应用体验的框架。主要特点包括:

  • 可靠 - 即使在不稳定的网络环境下,也能瞬间加载并展现。
  • 体验 - 快速响应,并且有平滑的动画响应用户的操作
  • 粘性 - 像设备上的原生应用,具有沉浸式的用户体验,用户可以添加到桌面
    目前已支持Android,iOS 11.3以后版本,Safari,Chrome,MS Edge。
閱讀全文 »

技术实力的本质和基本原则:

  • 不存在放之四海皆准的技术
  • 技术要能解决具体问题才有价值
  • 问题的复杂度决定技术实力的高度

在技术实力的基本原则前提下,将技术实力分为两大类,六个小分类。

硬实力

硬实力有四个等级,从低到高为点、线、面、体,对应的解决问题的复杂度也越来越高。

技术点

技术点是一个个颗粒性小,且相互较为独立的技术的使用方式和其原理认知。比如使用Java多线程的方式方法和解决的具体问题,使用Java进行I/O操作的方式方法和解决的具体问题。掌握了技术点,就可以开始基本的业务能力开发了

技术线

技术线是由若干个技术点串联起来的,该条技术线能解决某一类相关问题。比如一个常规的Web应用流程,用户发起请求,经过负载均衡路由,到达业务Controller进行业务逻辑处理,过程中对数据库的操作,对缓存的操作,然后返回结果给用户等。这就是由若干个技术点组成的一条技术线,这条技术线能支撑起来Web应用开发中实现业务功能的全过程。掌握了技术线,就能完成业务功能的全流程设计和开发了

技术面

技术面是由若干技术线排列交织而成。比如Web应用开发,性能优化,数据库维护等都属于技术面。掌握技术面,表明已经是某个领域的专家了

技术体

技术体既多个技术面的综合。最小的技术体也得有三个技术面组成。最常见的就是架构师,对于一个大型业务系统的架构师而言,需要掌握多个技术面,然后站在全局的角度进行系统,架构的设计和取舍,比如一个后端的架构师需要掌握Java开发的技术面,数据的技术面,网络的技术面,包括专业业务领域的技术面。掌握了技术面,表明已经是某个领域的资深架构师或专家了,可以解决领域级的复杂问题

软实力

软实力既不是很容易量化的一种能力,但是更能体现技术实力。

发现问题

发现问题是一个很重要的软实力,当系统出现问题后,大多数问题可以很容易的定位,但是就有个别问题找不出是因为哪个环节引起的问题,而往往这些找不出原因的问题都是优先级比较高或者比较严重的问题。还有一种场景是系统三天两头出问题,出一个问题解决一个问题,但是都是治标不治本,找不出反复引起问题的根本原因。所以发现隐藏很深很细节的问题和发现根源问题是彰显技术实力的一个软实力,这个能力主要来源于经验,有成功的经验,也有踩坑的经验,也有参考别人的经验。所以需要多思考、多总结、多学习、多交流。

技术创新

要达到这一项软实力其实比较难,比如在Google开创出大数据的大神,亚马逊开创出云计算的大神。但是这是我们为之努力的目标之一。

阅读文章:《当我们聊技术实力的时候,我们到底在聊什么》

本文首发CSDN,如需转载请与CSDN联系。

作为一名产品经理,首先要知道产品对于所属公司来说意味着什么,要探寻这个问题,我们又得知道和公司息息相关的是什么,在我的理解来看,与公司状况相关的因素有以下这些:

  • 市场份额
  • 平均订单金额
  • 盈利能力
  • 资产回报率
  • 从订单转化为现金的周期
  • 应收账款
  • 借贷成本

从这些因素体现出来的最直接的就是公司收入,公司的财务状况,进而可以得出公司的经营状况,如果这些指标一塌糊涂,那么这个公司离倒闭也就不远了。那么现在我们再来看产品对公司意味着什么,应该不难发现上面这些指标都离不开产品,产品的市场份额、产品的平均订单金额、产品的盈利能力、产品的回报率、产品订单转化为现金的周期、产品的应收账款、投入产品时的借贷成本。好的产品就能创造出好的这些指标,反之亦然,所以往大了说,产品经理在某种程度上对公司的生存有着一定决定因素,尤其规模不是很大的公司。那么作为产品管理者,如何能帮公司打造出好的产品呢?

武装自己

首先我们需要能让我们打造出好产品的方法论来武装自己,所谓方法论,就是一门学问所采用的方法、规则与公理,放在软件工程中,它便指一系列编撰好的建议方法、训练方法及材料、使用的各种工具。在当今的IT领域,这种方法论莫过于DevOps了,我用它武装为自己的铠甲。

我不打算就DevOps做概念上的解释,我要说的是为什么我要选择DevOps,它能给公司和产品带来哪些好处,概括来说有以下五点:

  • 它能使产品更快的投入市场。
  • 它能提升客户满意度。
  • 它能提升产品的市场份额。
  • 它能提升员工生产力及工作成就感和幸福感。
  • 它能给公司在市场中创造出巨大的竞争优势。

打造利剑

产品的产出过程就是开发过程,在开发方法上我选择敏捷开发作为我的利剑,虽然这不是什么新鲜东西,但是它却是经过长期千锤百炼,经得起考验的开发方法,就像使用千锻、万锻后的精钢打造的利剑一般,首先在材质上就不会轻易损坏,只是你能否耍好剑的问题。

从理论上来说,敏捷开发在当今湍流的IT领域中好处不言而喻,积极甚至激进的个体互动、时刻有可交付的成果、紧密的客户合作、快速的响应变化都完胜传统瀑布式开发那套冗长的过程、冗余的事无巨细的文档、漫长的合同谈判和循规蹈矩的拖沓计划。

有了利剑,我门要学习剑术,敏捷开发有若干方法可供我们使用,比如Scrum、特性驱动开发(FDD)、测试驱动该开发(TDD)、行为驱动开发(BDD)、精益开发等,但是敏捷开发不存在官方的方法,没有完整的方法列表,也不存在最好的方法一说,只有最合适的方法。我选择了Scrum,理由很简单,它同样经历了多年的历练,已去其糟粕。

閱讀全文 »

本文首发CSDN,如需转载请与CSDN联系。

AngularJS是什么

我们知道HTML是一种创建网页的静态标记语言,它很基础,但不失灵活,然而它自身并不提供对灵活性的具体实现,所以我们要创建具有可用性及赏心悦目的Web应用就需要使用其他语言与之结合去操控它的DOM、标签、标签属性、标签层级结构实现样式变换、动态数据变换、动态元素变换等,比如结合CSS和JavaScript语言。

但是越多的结合就意味着功能实现越复杂,我们需要写大量的代码去实现类似数据绑定、动态展现、远程服务请求等功能,所以jQuery这类的JS库、ember这类的框架应用而生。前者让我们在完成某些单一功能时调用它封装好的方法,从而减少代码量。后者让我们可以遵循它的规范去填充它设计好的代码结构,从而逐步完成完整的应用功能。

而AngularJS是JS库和框架的结合,它诞生于2009年,由Misko Hevery 等人创建,后为Google所收购并发扬光大。AngularJS通过为开发者呈现一个更高层次的抽象来简化应用的开发,提供了构建一个CRUD应用可能用到的全部内容包括:自定义HTML标签、事件绑定、数据绑定、基本模板标识符、表单验证、路由、深度链接、组件重用、依赖注入等。

文章中的所有示例均可在这里下载。

AngularJS的特性

AngularJS有着诸多的特性,但最为核心的是其Scope概念、MVC模式、路由、模块化、依赖注入、指令系统、双向数据绑定、Service、Provider等。

模块化

我们先从AngularJS的模块化特性说起。什么是模块?既应用程序中不同功能的容器。在AngularJS中,我们可以按业务功能的不同将实现划分为不同的模块,这些模块可以在一个JS文件中,也可以将它们放在不同的JS文件中,既一个JS文件为一个模块。

模块化的优势

使用模块化在我们的编程阶段有着诸多的好处:

  • 可以使我们的代码结构非常清晰,有较好的可读性。
  • 可以使我们复用代码。
  • 在前端编程中,我们都知道JS的引用顺序是很重要的,但使用AngularJS的模块时我们不需要关系每个模块之间的顺序。
  • 可以很好的实现单元测试。

定义模块

定义一个模块很简单,在JS文件中申明一个模块:

var mianModule = angular.module("mianModule", []);

使用AngularJS的module方法申明一个模块,该方法有两个参数:

  • 第一个参数为模块名称。
  • 第二个参数为一个数组,该参数的含义为当前定义的模块所依赖的模块,如果有依赖模块则传入包含模块名称的数组,若无依赖则传入空数组。
閱讀全文 »