坚持自己写文章的意义
首先,思维深度。AI写作是快,自己写作是慢。在思考时,我们需要慢下来,就像冥想一样,很多事情是需要时间,慢慢想清楚的。在网上已经充斥着大量的AI一键生成文章,写的很严谨、很漂亮,但缺乏最重要的“人情味”。现在还有人认真看完一篇AI写的技术文章么?至少我是很难看完的。反而是人写的一些思考感受,我会逐字看完,这是AI永远无法替代的与人交流价值。自己写文章的过程,就是深度思考的过程,这样写出来的文字,更
首先,思维深度。AI写作是快,自己写作是慢。在思考时,我们需要慢下来,就像冥想一样,很多事情是需要时间,慢慢想清楚的。在网上已经充斥着大量的AI一键生成文章,写的很严谨、很漂亮,但缺乏最重要的“人情味”。现在还有人认真看完一篇AI写的技术文章么?至少我是很难看完的。反而是人写的一些思考感受,我会逐字看完,这是AI永远无法替代的与人交流价值。自己写文章的过程,就是深度思考的过程,这样写出来的文字,更
为什么要用JUnit5?
任何把函数当做一等对象的语言,它的设计者都要面对一个问题:作为一等对象的函数在某个作用域中定义,但是可能会在其他作用域中调用,如何处理自由变量?
这个话题,网上很多人讨论过很多次,我也曾经聊过3次。
本书作者:测试开发刚哥,文章版权归个人所有,未经授权请勿转载。 fastjson介绍 fastjson是一个Java库,用来在Java对象和JSON之间相互转换。 fastjson的目标(官方原话): 我翻译一下: 性能非常好; 封装非常高; 转换非常强; 泛型也支持; 自定义表示; 复杂也支持; 这6个目标,书读少的我理解起来费劲,看着这些字,视线开始模糊…突然这些字动了,不断变幻,凝聚成了两个字:“牛逼”。阿里巴巴也确实做到了,fastjson(24.9k star)作为国产原创库,PK掉了jackson(7.6k star)和gson(21.3k star),在国内应用领域坐上了头把交椅。 安装fastsjon Maven引入: <dependency> <groupId>com.alibaba</groupId> <artifactId>fastjson</artifactId> <version>VERSION_CODE</version> </dependency> 版本可以在 https://mvnrepository.com/artifact/com.alibaba/fastjson 查找: 虽然2.0.x版本出来了,但是使用得多的还是1.2.x版本。至少得1.2.48以上,因为这以下的版本之前出过轰动全国的安全漏洞。 入门示例 Group.java public class Group { private Long id; private String name; private List<User> users = new ArrayList<User>(); public Long getId() { return id; } public void setId(Long id) { this.id = id; } public String getName() { return name; } public void setName(String name) { this.name = name; } public List<User> getUsers() { return users; } public void setUsers(List<User> users) { this.users = users; } public void addUser(User user) { users.add(user); } } User.java ...
本书作者:测试开发刚哥,文章版权归个人所有,未经授权请勿转载。 Python处理接口数据 接口数据通常是JSON格式,Python处理起来并不轻松。 方法一,json文件。额外编写代码读取文件,接口参数很多,文件变多,难维护。 方法二,字典。JSON可以直接粘贴到代码中,Python认作字典,但语法有差异,JSON的语法是true/false/null,Python的语法是True/False/None,不兼容。 这两种方法都有共同的缺点,需要编写表达式来定位某个节点。 比如:body["a"][0]["x"]["m"] 字符串与占位符 占位符是一种很常见的文本替换技术,在任何编程语言中都有广泛应用。 Python语法有个很特别的字符串,三引号字符串: test_json = """ { "bool": true, "x": null, "customerId": "123456", "items": [ { "productId": "987654", "quantity": 2, "price": 199.99 } ], "shippingAddress": { "recipientName": "张三", "streetAddress": "北京市朝阳区某街道123号", "city": "北京", "state": "北京", "postalCode": "100000", "country": "中国" }, "paymentMethod": { "type": "CreditCard", "cardNumber": "4111111111111111", "expiryDate": "12/25", "cvv": "123" }, "orderNotes": "请尽快发货,谢谢!" } """ 基本思路是,把JSON写在三引号字符串中,这能保留原生JSON格式,就像很多测试平台的做法一样,然后再通过占位符,直接替换其中的节点值。占位符不用编写表达式定位节点,在JSON字符串标记即可。 ...
函数装饰器是Python语言最优秀的设计之一,它以非常简洁的方式增强了函数的行为,让崎岖不平之路变得平坦顺畅。
用例独立。用例相互之间没有依赖,随便拉出一条用例就能执行。
Tasks和Events是Locust性能测试工具的核心技术,有了它们,Locust才能称得上是一个性能工具。
本书作者:测试开发刚哥,文章版权归个人所有,未经授权请勿转载。 设计模式 设计模式是前辈们经过相当长的一段时间的试验和错误总结出来的最佳实践。我找到的资料列举了以下这些设计模式:工厂模式、抽象工厂模式、单例模式、建造者模式、原型模式、适配器模式、桥接模式、过滤器模式、组合模式、装饰器模式、外观模式、享元模式、代理模式、责任链模式、命令模式、解释器模式、迭代器模式、中介者模式、备忘录模式、观察者模式、状态模式、空对象模式、策略模式、模板模式、访问者模式、MVC模式、业务代表模式、组合实体模式、数据访问对象模式、前端控制器模式、拦截过滤器模式、服务定位器模式、传输对象模式,共33种。 这些设计模式在纯面向对象编程语言中使用最多。**Python拥有一等函数,既不需要使用某些设计模式,也减少了某些设计模式样板代码。**本文将使用一等函数实现策略模式和命令模式,研究Python代码是如何简化的。 策略模式 策略模式概述:“定义一系列算法,把它们一一封装起来,并且使它们可以相互替换。本模式使得算法可以独立于使用它的客户而变化。” 经典实现 示例,根据客户的属性或订单中的商品计算折扣,规则如下: 有1000或以上积分的客户,每个订单享5%折扣。 同一订单中,单个商品的数量达到20个或以上,享10%折扣。 订单中的不同商品达到10个或以上,享7%折扣。 这很适合用策略模式来做,UML类图设计如下: 上下文,集成算法的类,图中Order会根据不同的算法计算折扣。 策略,实现不同算法的组件的共同接口,图中Promotion是个抽象类。 具体策略,策略的具体子类,图中FidelityPromo、BulkItemPromo、LargeOrderPromo分别对应上面3条计算折扣规则。 代码实现如下: from abc import ABC, abstractmethod from collections import namedtuple Customer = namedtuple('Customer', 'name fidelity') class LineItem: def __init__(self, product, quantity, price): self.product = product self.quantity = quantity self.price = price def total(self): return self.price * self.quantity class Order: # the Context def __init__(self, customer, cart, promotion=None): self.customer = customer self.cart = list(cart) self.promotion = promotion def total(self): if not hasattr(self, '__total'): self.__total = sum(item.total() for item in self.cart) return self.__total def due(self): if self.promotion is None: discount = 0 else: discount = self.promotion.discount(self) return self.total() - discount def __repr__(self): fmt = '<Order total: {:.2f} due: {:.2f}>' return fmt.format(self.total(), self.due()) class Promotion(ABC): # the Strategy: an Abstract Base Class @abstractmethod def discount(self, order): """Return discount as a positive dollar amount""" class FidelityPromo(Promotion): # first Concrete Strategy """5% discount for customers with 1000 or more fidelity points""" def discount(self, order): return order.total() * .05 if order.customer.fidelity >= 1000 else 0 class BulkItemPromo(Promotion): # second Concrete Strategy """10% discount for each LineItem with 20 or more units""" def discount(self, order): discount = 0 for item in order.cart: if item.quantity >= 20: discount += item.total() * .1 return discount class LargeOrderPromo(Promotion): # third Concrete Strategy """7% discount for orders with 10 or more distinct items""" def discount(self, order): distinct_items = {item.product for item in order.cart} if len(distinct_items) >= 10: return order.total() * .07 return 0 实现策略模式的关键代码是Promotion类,它是一个抽象基类,通过继承abc.ABC来定义。 ...