寫前端測試

前端測試的類型有:

  • Unit testing
  • Visual regression testing
  • Acceptance Testing
  • End to End Testing ( functional testing )
  • Snapshot Testing

不錯的工具:
jest-runner-groups
關注的工具:
cypress-react-unit-test

挑選工具:
https://react-hooks-testing-library.com/

參考文章:

Testing Overview
An introduction to frontend testing
What is Acceptance Testing? | Agile Alliance

What Is Defect Clustering and How Do You Defeat It?
解釋何為”Defect Clustering”
30天快速上手TDD

Fullstack React: Introduction to Testing
Visual Regression Testing is Stupid

TOP VISUAL REGRESSION TESTING TOOLS
Front End Testing: A Complete Conceptual Overview

Automated Frontend Testing

Common mistakes with React Testing Library

Testing Your Frontend Code: Part IV (Integration Testing)

Static vs Unit vs Integration vs E2E Testing for Frontend Apps

How They Test

storybook

 

利用storybook可以更直觀的知道元件在各種UI互動狀態下應該怎麼呈現!


下面的那些就是stories啦!


下面這三個就是它的test cases

title(螢光筆劃線的地方)不能重複

title在這裡定義(export default是寫metadata的地方)
Task.stories.js

 

注意這裡


原來propTypes是可以沿用的!!

 

如何測試:用套件(addons)
這裡要用Storyshots addon,它會幫每一個story做snapshot test

 

Sep.12.2020
storybook又改版了…語法要換一換

2020面試心得

《華奧科技有限公司》
一開始先簡單的自我介紹一下,我覺得我在講工作的部份應該再講仔細一點,
例如前幾年比較多工作在切版、做特效,用jQuery維護網站,
這幾年用的是前端框架,學習它的ecosystem,也會不時上網查看新知
應該說明一下我除了工作之外還會多上網看有出什麼新東西…

1. React.js的LifeCycle有哪些?
2.你會怎麼處理deep copy和shallow copy
我跟他說我會用一些套件來處理,他說他會直接送一個新的陣列之類的,效能上比較好
3.SPA和MPA的差別?
4.怎麼處理瀏覽器的緩存機制
5.知道SSR嗎?大概解釋一下
6.多域名問題怎麼處理(CORS)
他說後端處理最簡單,但前端其實也可以處理,我跟他說我的處理方法比較笨會用寫死的方式(應該來查查)
7.閉包是什麼,用起來會有什麼問題?
8.有用過TypeScript嗎?
9.解釋一下Redux
10.多語系會怎麼處理
11.怎麼處理xss什麼的
12. ES6的資料型態有哪些

【技術主管介紹時間】
運彩服務,已經有平台了,可是要重做,要用的還在規劃中
PWA有考慮做(他問我能不能說下PWA)
公司使用的技術:後端golong、Docker,前端React.js
公司QA有3~4個,是一個團隊
有歐洲客戶也有亞洲客戶,
英國那邊比較嚴謹,每次代碼都要送審,才會通過發佈
目前還沒有發生過BUG在生產上要急修的問題
亞洲客戶有考慮樣式客製化調整

【HR時間】
公司不能穿拖鞋

 

升鼎科技股份有限公司 

一開始面試考leetcode,幾個工程師看我現 場作題==|||
做到一半我解釋我的邏輯,他們竟然說是對的,我就繼續try下去
後來考完就是
【自我介紹時間】
我demo了一下澳門皇冠,還有天成彩票
他問我有沒有做到響應式的網站(我說活動頁有
我說前幾年做的是切版工作居多,之後做的就比較偏向程式邏輯面。
他們在看我秀彩票的時候,有問我這個專案我的參與度大概多少。
我說假設是新功能我可以獨立完成,可是從無到有建置一個網站就比較不行。
他們問我有沒有用什麼grid system,我說沒有
我有說我用sass預處理器
也有問我有寫過TypeScript嗎?

【聊工作時間】
他們有六個工程師,一個前端,用的後端語言是PHP, node.js(竟然只有這二個!)
前端是用React.js

面試官說他們有點像是博奕業。是做虛擬幣交易平台的,
當然也有做其它東西,不過目前主軸應該是這個
他說交易平台有二種,場外跟什麼的,
這個是合法的,但如果別人想拿現金來買虛擬幣就不合法
就類似銀行可以拿台幣來換美金,那是只有銀行才能做的,
我們不能隨便開銀行之類的…
使用者交易虛擬幣,然後收取手續費。
不像博奕,莊家可以作幣就可以偷賺更多。
之後還考慮做ai之類的
前端的工作內容大多是偏向基本畫面架構,邏輯是優化使用者體驗相關的
不會是業務邏輯面。
每天下班前報告一下自己做了什麼,每週五會開一次會,討論問題是平常就會討論了。

以後規劃要做醫療相關的產品,先去取得一些data然後去看能做啥分析或是賣給別人
(法律問題先不考慮,先有data再說)
公司專案都是老闆去外面開發需求過來的。
我問有沒有用敏捷開發跟git flow ,他說公司有用簡化版的git flow 、簡化版的敏捷開發

問他們想要什麼樣的員工,他說想要不是斤斤計較加班費
會要求公司成長的員工(公司成長跟員工的成長是綁在一起的)
會有code review,前端要自己測試

【人資時間】
人資說她自學了wifi打卡系統的程式,進入公司就等於打卡了(屌== )

面試要問的問題:
1. 公司是用敏捷開發嗎?
2. 用git flow嗎?
3. 多久開一次會?
4. 會有code review嗎?
5. 前端用什麼框架?
6. 後端用的語言是哪些?
7. 公司需要什麼樣的員工?

《瑞嘉軟體科技股份有限公司》
自我介紹完之後,面試官問幾個問題
1. 解釋一下redux。它是怎麼讓react的元件更新的
(詳細流程,有沒有用中介軟體啥的…
2. Rx.js是做什麼的
3. 有沒有聽過OOP,設計模式
4. functional programming
5. react的lifecycle用了哪些
6. 怎麼用hook
7. 會不會寫單元測試
8.你有寫過TypeScript嗎?

主要做運動的,從本來的公司切出一個分支出來,所以有新的公司名子
有二個部門,一個是解決舊的煩惱,一個是維護舊的另外也要跟新的串接起來
我問他們用什麼前端框架,他說是用react,所以才找react。
公司大約四個專案,裡面有不少舊的代碼,還會有jQuery,不過沒有考慮要重構
他們的前端很多都也會後端,後端語言好像用.net 跟asp什麼的
舊部門主管問我排不排斥看到很舊的寫法,
ES5之類的,假設要改的話會用新的嗎,還是舊的?
另外還說他們一份專案可能經手過二十幾個人,
所以各種不同的寫法,一開始都是先求有就好了。
舊部門還在用SVN!!!!!!!!!!!!!!!!!
新部門的話就應該會用一些新的技術,前端一定要會寫單元測試跟什麼測試的。
工程師要on call

RD時間
有員工旅遊什麼的!
女生穿著沒特別規定
技術人員不太需要出差

 

Visual Studio Code tab縮排問題

發現縮排很大,在這邊調設定:

Tab Size 改成想要的數字,我這邊改成2。然後點進去Editor: Detect indentation

假設它有打勾的話,把它勾掉,就可以嘍!

再回頭來看看我的代碼…好,很好,很完美。

Imperative Pattern vs Declarative Pattern

在讀JavaScript的時候,這兩個Pattern常常被提到,做了一下筆記。
假設我們要做一個包含很多人物的物件。

const characters= [
  {name:'Curapica', age:15}, 
  {name:'Killua', age:13},
  {name:'Gon', age:12},
  {name:'Leorio', age:17},
];

這時候這二種pattern的寫法就會是這樣:

/* Imperative Pattern */
for (let i = 0; i < characters.length; i += 1) {
  characters[i].lastSeen =  new Date();
}

/* Declarative Pattern */
characters.map((book)=> {
  characters.lastSeenBy = 'me';
  return characters;
});

Declarative Pattern:要做什麼
Imperative Pattern:如何做

想像是兩個個性不同的妹子,就是這樣:

JavaScript sort()

const numbers = [1, 2, 4, 3];
numbers.sort();
// 1, 2, 3, 4

sort是一個不錯的方法,可以排順序,例如排商品的價錢、時間的遠近,又或是誰快生日了、誰的年紀最大…等等。另外也可以自己寫一個陣列order,處理中文字串的排序。
例如

const class = [‘公爵’, ‘侯爵’, ‘伯爵’, ‘子爵’, ‘男爵’];

可是其實還有個詭異的地方,要是陣列是這樣:

出來的結果讓人意到不到。😱😱
W3School的解釋是這樣:

By default, the sort() function sorts values as strings.
This works well for strings (“Apple” comes before “Banana”).
However, if numbers are sorted as strings, “25” is bigger than “100”, because “2” is bigger than “1”.

所以如果要處理數字陣列由小到大排序的話,要另外再帶一個function來處理

醬子就沒問題惹辣🤗

另外也可以排true / false的順序

const array1 = [true, false, true, false, false];
array1.sort();


排序預設計是Ascending,false到true
這裡可以想像成是零到一…因為零是false…凌波零是false…

注意,以上數字的好解決,要排英文字母的話就比较麻烦:

var cars = [
			{type:"Volvo", year:2016},
			{type:"Saab", year:2001},
			{type:"BMW", year:2010}
		];
		

		cars.sort(function(a, b){
			var x = a.type.toLowerCase();
			var y = b.type.toLowerCase();
			debugger
			if (x < y) {return -1;}
			if (x > y) {return 1;}
			return 0;
		});

寫了二個function之後發現它其實可以簡化:

const sortAlphabetically = (a, b) => {
    const textA = a.siteName.toUpperCase();
    const textB = b.siteName.toUpperCase();
    return textA < textB ? -1 : textA > textB ? 1 : 0;
  };
  const sortAlphabeticallyDesc = (a, b) => {
    const textA = a.siteName.toUpperCase();
    const textB = b.siteName.toUpperCase();
    return textA < textB ? 1 : textA > textB ? -1 : 0;
  };

簡化成這樣:(如果需要有二種)

const propComparator = (propName, bool) => {
    // asc
    if (bool)
      return (a, b) =>
        a[propName].toUpperCase() === b[propName].toUpperCase()
          ? 0
          : a[propName].toUpperCase() < b[propName].toUpperCase()
          ? 1
          : -1;
    // desc
    return (a, b) =>
      a[propName].toUpperCase() === b[propName].toUpperCase()
        ? 0
        : a[propName].toUpperCase() < b[propName].toUpperCase()
        ? -1
        : 1;
  };

在debugger那边查看,可以得知要是 拿 x – y 来看的话,它会回传NaN,可见sort要吃数字或是 true/ false,文字虽然有分大小,但却不是数字,不能拿来做数学运算。

參考影片:慎點,難聽印度腔
Ascending and Descending Order – Learn Math

 

JavaScript 實用代碼段

concat也可以concat物件

.提取特定的物件資料,例如

var array1 = [
{ name: 'Luna', age: 99 },
{ name: 'Baby', age: 1 },
{ name: 'Curapica', age: 18 }
];
var found = array1.find(function(element) {
  return element.name === 'Luna';
});
console.log(found);

//  > Object { name: “Luna”, age: 99 }

var array1 = [
{ name: 'Luna', age: 99 },
{ name: 'Leo', age: 1 },
{ name: 'Baby', age: 1 },
{ name: 'Curapica', age: 18 },
];
var found = array1.find(function(element) {
  return element.age === 1;
});
console.log(found);

記得它只會回一個…所以給的值要是特定的,例如 gameId

const lunaCute = [1, 2, 3];
lunaCute.map(() => []);

初始化陣列

Array.from(Array(N).keys());

把字串的逗號拿掉:(例如 1,000)

parseInt(DefaultStake.replace(/,/g, ""))
const arr = [
  {
    name: 'somestring',
    id: 42,
    fat: true,
  },
  {
    name: 'joanne',
    id: 3,
    fat: false,
    story: 'long',
  },
];
arr.reduce((a, c) => {
  const [key] = Object.entries(c);
  return a.concat(key);
}, []);

 



參考文章
13 useful JavaScript array tips and tricks you should know – DEV Community 👩‍💻👨‍💻

react debug时的问题

在react的debug时,如果遇到像这种 ` ` 的地方,会造成下面的程式码没有高亮提示…这时候如果在大括号旁边加上双引号的话就可以了
原因应该是因为单引号会造成HTML判断结束在这边 ( >> HWD C.M Chen )

但這樣寫又有可能造成其它問題
所以還是換firefox吧…

這是chrome卡了好幾年的bug

相關討論:
https://bugs.chromium.org/p/chromium/issues/detail?id=659515

React 的state更新延遲

我發現react的state更新,假如在setState之後馬上console.log() 那個state,它還是舊的state,但是在render的時候就是新的了。從上面這個可以測試…

不過如果是要靠著state印出畫面的話就沒關係,畢竟在render上能拿到新的state….

 

 

在chrome上模擬JavaScript的hover

方法一:

var event = new MouseEvent('mouseover', {
	'view': window,
	'bubbles':true,
	'cancelable':true
});

document.querySelector('.luna-cute').dispatchEvent(event);

因為用chrome無法模擬JavaScript製造出來的hover效果,所以要用這個方法來模擬。

方法二:

對想要hover的element按右鍵,再移到dev tool上,就會維持hover的狀態了
(鍵盤再用↑↓移到檢查)