duangsuse::Echo
719 subscribers
4.28K photos
130 videos
583 files
6.49K links
import this:
美而不丑、明而不暗、短而不凡、长而不乱,扁平不宽,读而后码,行之天下,勿托地上天国。
异常勿吞,难过勿过,叹一真理。效率是很重要,盲目最是低效。
简明是可靠的先验,不是可靠的祭品。
知其变,守其恒,为天下式;穷其变,知不穷,得地上势。知变守恒却穷变知新,我认真理,我不认真。

技术相干订阅~
另外有 throws 闲杂频道 @dsuset
转载频道 @dsusep
极小可能会有批评zf的消息 如有不适可退出
suse小站(面向运气编程): https://WOJS.org/#/
Download Telegram
Forwarded from Rime RainSlide
@duangsuse 对了,长长的东西,你其实可以在别的地方写好,再粘贴到 https://telegra.ph
Forwarded from dnaugsuz
不是没有道理,我最近打算对于一些比较完整的东西可以拿 TeX 排出来(对于有数学公式或者 tikz 图的那些)或者拿 HTML 写,这样可以顺便练习一下排版能力。
Forwarded from 羽毛的小白板
🤔 Span 系类型无法运用在泛型参数里。原因是因为会有逃逸 stackonly 约束的可能性
Forwarded from 羽毛的小白板
Forwarded from 羽毛的小白板
看了下 Android 的 SparseArray 的实现,似乎和 .Net 的 SortedList<K, V> 没什么区别
🤔 这个星期本来有很多事情需要讲的(主要是技术,而且我想说我要用 imperative 的 Kotlin 写个 BCE 程序,顺便学学写我的第一个矩阵等式求解算法)
可是呢,duangsuse 的身体目前比较糟糕,所以为了健康还是必须 11 点下机的。

但愿一切都好吧。 #life #tech #dev #backend #algorithm
#GitHUb #Kotlin #issue https://github.com/icela/FriceEngine/issues/83

org.frice.anim.scale.SimpleScale 类中的 obj.scale(deltaTime * x, deltaTime * x) 这句后面应该是y吧?

写错了。虽然 Frice 的项目持续集成构建和测试都有做(
(当然冰封现在早就不搞这种事情『计算机图形上的封装』了...)
This media is not supported in your browser
VIEW IN TELEGRAM
#Java #Ruby #Kotlin #Test #Dev
https://docs.cucumber.io/guides/10-minute-tutorial/

一个『类似自然语言』的 Specification Tests 框架:

快速学习一下如何来使用它!(本频道一直引以为豪的是,在其他频道只『给个链接、点个 Star』的时候,本频道会给予大家快速上手讲解)
以下示例基于 Java 8(实际上 Java 1.1 都可以用)

首先,你的直觉要并入这些,以便快速地理解使用方式:

1. 所谓『功能性』软件测试(Behavior-Driven Tests),是因为要确定软件的『某一项功能』是否能正常如预期地工作

此外,还流行以下测试侧面方案:完整验收测试 / (就测试层面而言)黑盒白盒测试 / 兼容性和性能(弹性... 负载... 压力)测试 / 回归测试(验证修复方案是否能用) / Smoke (快速的简单完整功能测试)

2. 这种测试是这样的,你们看看(主要是因为很多人对功能性测试和洋文的直觉不好,我翻译一下):

特性: 更改头像
“我们的用户可以上传自定义头像以取代默认头像”

场景: 普通用户可以更改自己的头像
情况: 这个用户是普通用户
当: 他想更新自己的头像时
那么: 他应该能够成功更新自己的头像

场景: 被我们 Block 的用户不能更改自己的头像
情况: 这个用户是封禁用户
当: 他想更新自己的头像时
那么: 他应该无法成功更新自己的头像

或者说:

Feature: Users can change their avatar
We expect that normal users CAN change their avatar

Scenario: The user is normal user
Given a normal user
When he wants to update his avatar
Then he will able to update his avatar

Scenario: The user is blocked
Given a banned user
When he wants to update his avatar
Then he will not able to update his avatar

类似的测试可能还有很多,比如,被封禁的用户不能更改自己的用户名、不能发布评论...

设想一下,如果我们有这样的软件需要测试,那么,有一种 DSL 来帮助我们把测试写得更好,更具备可读性和可维护性,减少余赘代码,岂不美栽? 🤔

这门 DSL 叫做 Cucumber. (准确的说,叫 Gherkin,它只是 Cucumber 测试框架的一部分)

至于包管理什么的杂七杂八的内容,你们知道那是码农的工作,我们不用管(待会『三声,上声』会『四声,去声』讲)
我们来看看上面的例子该怎么写(伪代码,不准喷不是函数式,函数式什么的我会独立讲,再说工程第一是吧)

import cucumber.api.java.en.Given;
import cucumber.api.java.en.When;
import cucumber.api.java.en.Then;
import static org.junit.Assert.*;

public class Stepdefs:
boolean blocked = false;
Exception gotException;

@Given("a normal user")
fun givenNormalUser() = Unit
@Given("a banned user")
fun givenBannedUser() = { blocked = true }

@When("he wants to update his avatar")
fun askedUpdateAvatar() {
try { UserResource.updateAvatar(UserResource.findUser { it.banned == blocked }.first, Avatar.fromURL("https://example.org/a.png")) }
catch (SecurityException e) { gotException = e }
}

@Then("^he will (.*) to update his avatar$")
fun itChecksUserPermission(String desc) {
when (desc) {
"able" -> assertNull(gotException)
"not able" -> assertNotNull(gotException)
}
}


下面是无聊的码农内容,就是包管理的,虽然这种东西比较 trivial 本身也是码农内容(跑)
mvn archetype:generate 记好了,这些参数
1. archtype 的 Group、ArtifactId、Version
2. 你项目的 Group、AId、Version
3. -DinteractiveMode=false 全自动生成
以上参数全都是 camelCased 的,风格为 Java 的单 dash(-) 前缀。

(相关知识: Maven Coordinate:Group:ArtifactId:[packaging[:classifier]]:Version
记住,G:A:V 就可以吊打很多连 Maven 是啥,用的啥模型都不知道的 Android Dev 了(跑,但这的确是事实,因为实际上 Android 主要还是和 Android API 和 XML / 组件/View 模型什么的杠,有些入门萌新连 Gradle/Groovy/Maven 到底是做什么的都不知道,也不知道 Dependency Scope、Artifact、Tasks 之类的东西,2333333)。

然后在项目目录里 mvn test 就可以运行测试。

上面的 Feature/Scenario/Given/When/Then 语法结构,可以在项目的 Test Resource 下的指定 Java 包里创建,一般放在 src/test/resource/<package>/ 里,必须以 .feature 为后缀名,前缀名随便
而 Tests 的代码,就放在同一个 Java 包的 Stepdefs.java 类里,然后代码上面那样写。

== 搞基一点: 使用 DSL 指定输入数据

别用 Scenario 了。用 Scenario Outline

Scenario Outline
:
Given Arithmetic expression "<expr>"
When I asked the result
Then It should be "<answer>"

Examples:
| 1+1 | 2
| 0*9 | 0
| 0+3 | 3

其他的 matching 上面讲过了,不说了。
我觉得还不错。 +1

剩下的更高端一点的内容呢,我没时间看,算了,给个语法结构目录就跑。

至于中文支持呢,有,这里可以看到,不过具体是怎么实现的呢(我不说最无聊的句构解析器部分,因为的确很无聊)?其实 Runtime 会根据对应平台的 Code Snippet 自己生成相应的实际 API 类编译加载,不过 IDE 用的包我不清楚是哪里生成的,找了很久,没时间管这些。

== FIX: 找了很久我没看到他们用 sun 的 javac API,我又看了一会才知道,这整个就是一代码生成器程序...
This media is not supported in your browser
VIEW IN TELEGRAM