咨詢郵箱 咨詢郵箱:service@yitianxinda.com 咨詢熱(rè)線 咨詢熱(rè)線:18101296137 微(wēi)博 微(wēi)信
北(běi)京軟件(jiàn)開(kāi)發測試驅動開(k™&āi)發_北(běi)京軟件(jiàn)開(kāi)發公司
發表日(rì)期:2016-06-13 10:13:0÷&4    文(wén)章(zhāng)編輯:yitianxi±  ¶nda    浏覽次數(shù):

  北(běi)京軟件(jiàn)開(kāi)發測試驅動開(kāi)發(TDD)是(shì)一(yī)種開(kāi)®≤★$發方式,它改變了(le)傳統軟件(jiàn)開(kāi)發的(de) ↑±Ω流程,即首先設計(jì)程序,再進行(xíng)編碼與測試≤≤♠♦工(gōng)作(zuò)。TDD采取了(φ✘δ★le)很(hěn)小(xiǎo)的(de)增量式開(kāi)發方式:首先編寫一✘↓(yī)個(gè)測試,再編寫實際程序代碼以通(tōng)過測試,Ωφ✘&較後對(duì)代碼進行(xíng)改進。這(zhè)種方式的(de)結果₹φ∞是(shì)大(dà)量的(de)(通(tōng)常可(kě)達到(dào) ≤γ幾千個(gè))自(zì)動化(huà)測試,能(néng)夠在幾秒(m∑ε≠iǎo)鐘(zhōng)之內(nèi)執行(xíng)完畢。

  測試人(rén)員(yuán)需要(yào)注'©意到(dào)一(yī)點,這(zhè)些(xiē)高(gāo)效的(de♦ ≥π)自(zì)動化(huà)單元測試剔除了(le)大(dà©¥)多(duō)數(shù)手工(gōng)測試的(de)執行(xíng♥±★)。這(zhè)樣一(yī)來(lái)©±,我們就(jiù)需要(yào)重新反思是(s→₹&hì)否有(yǒu)必要(yào)在TDD團∞®¶隊中繼續保留測試人(rén)員(yuán)的(de)角色。

  從(cóng)表面上(shàng)看(kàn),無論是(shδπ§ì)否采用(yòng)TDD,&ldqu $δo;測試人(rén)員(yuán)”都(dōu™¶♥)是(shì)團隊中必不(bù)可(kě)少(s™✔×hǎo)的(de)角色,但(dàn)實際情況要(yào)複雜(zá)得λ★(de)多(duō),現(xiàn)在讓我們來(lái)看(kà×♦n)看(kàn)這(zhè)些(xiē)複​€雜(zá)性體(tǐ)現(xiàn)在何處:

  如(rú)果你(nǐ)打算(suàn)開(kāi§φ¶‌)始嘗試TDD,那(nà)麽建議(yì)你(nǐ)不(bù)要(yào)試♠λ↕圖在團隊中揉合老(lǎo)派的(de)QA與功能(néng)測試人≈ (rén)員(yuán)。

  如(rú)果你(nǐ)已經成功地(dì)實施了(le)TDD,那(nà± β&)麽在團隊中安排一(yī)位專攻測試的(de)成員(yuΩ¶✘∏án)仍然是(shì)有(yǒu)意義的(de)。

  在TDD中團隊中能(néng)夠取得(d≈¶e)成功的(de)測試人(rén)員(yuán)與傳統的₩φ£÷(de)功能(néng)測試人(rén)員(yuán)的(de)區(qū☆σ)别在于,前者具有(yǒu)更紮實的(de)技(jì)術 ∞(shù)背景。

  QA的(de)興衰

  在對(duì)“TDD已死?”這(zhè)一(yī£σ)主題所展開(kāi)的(de)一(yī)$¥次對(duì)話(huà)中,Kent Beck(♦₩‍>KB)、Martin Fowler(MF)與David Heinemei ≥↓er Hansson(DHH)圍繞著(zhe)QA與測試展開(kāi ≤‌←)了(le)激烈的(de)討(tǎo)論。他(t &δ↑ā)們指出了(le)專職測試人(rén)員(yuán)曆史的(d¥≥e)3個(gè)發展階段:

  堆積QA:通(tōng)常指機(jī)能(néng)失調的(de)Q'​≠"A部門(mén),其中充斥著(zhe)大(dà)量的(de)÷₽β功能(néng)測試人(rén)員(yuán)。

  摒棄QA:對(duì)于讓程序員(yuán)負責測試的(de)做(zuò)★↕✘>法過于自(zì)信,在開(kāi)發過程中摒棄測試人(r↓" Ωén)員(yuán)。

  當前現(xiàn)狀:在項目中引入适當的≤¥(de)QA(甚至是(shì)功能(néng)性的(d♠≈e))仍是(shì)有(yǒu)必要(yào)的(de)。

  流行(xíng)于上(shàng)世紀90年(nián)代的(de×₹ )堆積QA的(de)做(zuò)法現(xiàn)在看(kàn)來(lá§σ i)似乎已經過時(shí)了(le),許多(duō)IT組織  Ω♣已經解散了(le)他(tā)們的(de)QA部門(mén),并将測試♠λ人(rén)員(yuán)分(fēn)派到(dào× ✔₹)各個(gè)敏捷團隊中。不(bù)過,在許多(duō)敏捷團隊中,>©這(zhè)些(xiē)測試人(rén)員(y₹©<£uán)仍在繼續著(zhe)早期的(de)手工(σ↓®gōng)測試任務。衆多(duō)組織仍然受困于延續自(zì<€)20年(nián)前的(de)機(jī)能(néng)失®↔₹↑調的(de)測試方法。

  老(lǎo)派的(de)QA方式之所以出現(xiàn)機(jī)能(nén↑&' g)失調的(de)情況,是(shì)因為(wèi)這(zhè<→®β)種方式依賴于大(dà)量的(de)功能≥® ≠(néng)測試人(rén)員(yuán)。這(zhè)些(xiē)‌‍測試人(rén)員(yuán)是(shì)手工(gōng)測試方面≥₽✘₩的(de)專家(jiā),但(dàn)對(duì)于技(j£↓÷ì)術(shù)方面的(de)技(jì)↔÷&‌能(néng)知(zhī)之甚少(shǎ♦↑≠₽o)。測試人(rén)員(yuán)的(de)專業(yè)性←♠π★決定了(le)他(tā)們擅長(cháng)于₽φβ對(duì)功能(néng)的(de)&≠↓€®ldquo;測試”。但(dàn)是(shì​×​),老(lǎo)派的(de)QA部門(mΩ↓  én)更傾向于(同時(shí)也(yě)出于商業(yè)利益的(de$↑)考慮)讓這(zhè)些(xiē)測試人(ré<±‌n)員(yuán)對(duì)功能(néng)進行(xínα•♦>g)“檢查”。

  “檢查”的(d∏≥↑e)主要(yào)特點在于:這(zhè)種測試完全可(kě)以實現→  ♣(xiàn)自(zì)動化(huà)(Bach ↓©§β與Bolton 2013)。這(zhè)就(jiù)意味著(zhe)&ldqu ≤©φo;檢查”功能(néng)可(kě)以由程序員( >↓yuán)完成。至于是(shì)應該讓測試人(rén)員(yuán'× π)還(hái)是(shì)程序員(yuán)進行(xíng)功能(néng'↔)“檢查”,這(zhè)種選擇貌似随意¥α,其實不(bù)然:無論是(shì)發現(xiàn)bu£λ±↑g、進行(xíng)隔離(lí)、彙報(bào)、跟蹤♦ '或是(shì)提出修複意見(jiàn),測試人(rén)員(yuán)都♥π>'(dōu)要(yào)花(huā)費(fèi)更多(d ☆∞uō)的(de)時(shí)間(jiān)(& εKaner 2001)。

  通(tōng)過手工(gōng)測試人₽✔(rén)員(yuán)對(duì)功能(néng)進行(xíng)&l↕Ω•↔dquo;檢查”的(de)方式讓老(lǎo)派的(de)QA‌•α變得(de)非常低(dī)效。一(yī)旦團隊培養出“不(bù₹§★)要(yào)測試自(zì)己的(de)代碼,把它丢給Q∏¶A去(qù)做(zuò)”這(zhè)種觀念λΩ,測試工(gōng)作(zuò)就(jiù)變得(de)機(jī)能(nε Ω÷éng)失調了(le)(KB與DHH在這(zhè)次對(λ &Ωduì)話(huà)中的(de)觀點)。這(zhèΩ₽← )種方式發展到(dào)一(yī)定程度,就(jiù)會(huì)造成效率的Ω​§↑(de)不(bù)斷下(xià)降,随著≠>÷​(zhe)投入的(de)測試人(rén)員(yuán)越>φ<$多(duō),反而會(huì)造成bug數(shù)量的(de)不(bù)∞σγ斷升高(gāo)。('Better Testing - Wor•£se Quality',Hendricksו•on 2001)

  摒棄QA是(shì)對(duì)于手工(gō>&ng)測試這(zhè)種機(jī)能(néng)失調的(de)§ ♦♦實踐的(de)一(yī)種自(zì)然反應。之所以本文≤ε‌(wén)的(de)标題沒有(yǒu)取名為(wèi)“敏捷☆≥≤團隊中的(de)測試人(rén)員(yu©♦'¶án)”,是(shì)因為(wèi)摒棄QA的(de)做(zuò)δ​法在某些(xiē)情況下(xià)并不(‌↕ ≈bù)可(kě)行(xíng),比如(rú)你(nǐ)的(de)敏捷團隊雖然實±←δ£施了(le)Scrum框架,卻沒有(yǒu)進行(xíng)任¥$∏₽何自(zì)動化(huà)單元測試,又(y§≥↑òu)或是(shì)團隊正在進行(xíng)某些(xiē)商業(y≥®>è)現(xiàn)成品或技(jì)術(shù)(COTS)的(de)軟件(jδ✘±iàn)開(kāi)發。如(rú)果團隊中沒有(yǒu)設立功能(n≤¶σ≥éng)測試人(rén)員(yuán),則必須實施TDD實踐,或是(s↑≈♠εhì)其他(tā)任何一(yī)種能(néng)夠生(shēng)​↓成自(zì)動化(huà)單元測試的(de)方法。

  在大(dà)多(duō)數(shù)情形下(xià),選擇 ‍®了(le)TDD就(jiù)意味著(zhe)你(nǐ)必須↑¶改變程序員(yuán)的(de)技(jì)能(néng)、習(xí♠★&)慣,并且往往還(hái)需要(yào)改變他(tā)們的(de)态度與自♠σ✔σ(zì)我意識。而實現(xiàn)以上(sh✔‍↓≤àng)這(zhè)幾點并不(bù)容易★✔₽φ,同時(shí)TDD本身(shēn)也(yě)并非可Ω (kě)以一(yī)促而就(jiù)的(de):“要(→÷yào)很(hěn)好(hǎo)地(dì)掌握遺留↔φ₹代碼、對(duì)單元測試進行(xíng)适當的(de)隔離(lí)、以及≠©✘β集成測試是(shì)非常困難的(de)&rdquoσ→σ;(Shore 2007)。根據評估,當程序員(yuán)轉為(w↑←÷∑èi)采用(yòng)TDD實踐後,前幾個(gè)月(yuè)的(d‍∑e)生(shēng)産力會(huì)急劇(jù)下(xià)降¶↓•λ。不(bù)僅如(rú)此,對(duì)實踐TD∑←'D的(de)新手往往要(yào)進行(xελ∞←íng)幾周乃至幾個(gè)月(yuè)®×時(shí)間(jiān)進行(xíng)手把手的(de)培訓<≤λ(Larman,Vodde 2008)。

  依我的(de)經驗看(kàn)來(lαπái),老(lǎo)派的(de)程序員(yuán)與測σ€♦試人(rén)員(yuán)之間(jiān)往往存在β♠©著(zhe)一(yī)種共生(shēng)現(xiàn)象。老(lǎo)派的(<δde)程序員(yuán)不(bù)喜歡進行(xíng)單元測試,Ωπ隻要(yào)項目中有(yǒu)測試人(rén)員(yuán),他(tā)們β®•™就(jiù)企圖蒙混過關。而老(lǎo)派的(de)測試人(rén)員(yuá™™n)也(yě)不(bù)願意學習(xí)技(jì)術(•₩shù)知(zhī)識,隻要(yào)為(wèi)程序員(yuán)找到(↔≠'×dào)了(le)足夠的(de)bug,他(tā)們也(yě)同樣選擇應¶‍付了(le)事(shì)。老(lǎo)派的(de×‌)程序員(yuán)與測試人(rén)員(yuán)都(dō✔εu)希望避免進行(xíng)任何改變。因此,在我看(kàn)來(l©δái),如(rú)果程序員(yuán)已經₹α開(kāi)始實施TDD實踐,再往團隊中安置一(yī $€↔)個(gè)功能(néng)測試人(rén)員(yuán)就(jiù)是(s₽ 'hì)一(yī)個(gè)壞主意。

  我在多(duō)年(nián)的(de)經驗中觀察到(dào)了(le)♦↕π這(zhè)種反模式:如(rú)果你(nǐ)打算(suà¶↔↕αn)采用(yòng)TDD或其他(tā)某種由開(kāi)發者進行(xín←←g)測試的(de)實踐,那(nà)麽僅僅是(shì)因為(wèi)在團隊中出現®β(xiàn)了(le)一(yī)位功能(néng)測試£©人(rén)員(yuán),就(jiù)φ♠會(huì)讓你(nǐ)的(de)努力付諸東(dōng)流。因Ω✘此,如(rú)果你(nǐ)确實計(jì)劃實施TDβφD,我的(de)建議(yì)是(shì)從(có₽♠ng)團隊中取消功能(néng)測試人(rén)員(yuán)的 >↓(de)角色!

  但(dàn)事(shì)實上(shàng),在實γ"施TDD的(de)過程中,在團隊中保留一(yī)定的(de)QA仍然是(shì‌≈)必要(yào)的(de),這(zhè)是(shì)因為(wèi)∏$某些(xiē)變化(huà)或許會(huì)出乎你(nǐ)的(de)意料。在上♣≈€(shàng)述關于TDD與QA的(de)π₽↓≥對(duì)話(huà)中,David Heinemeier Hansγ✔¶son說(shuō)道(dào):&ldqΩ€uo;或許你(nǐ)已經通(tōng)過了(le)所有(↕ε ≤yǒu)測試,但(dàn)或許它并沒有(yǒ∏λ≥u)發現(xiàn)真正的(de)問(wèn)題。一(yī)旦到☆​(dào)了(le)實際應用(yòng)過程中,用(yòng)戶會(h™"• uì)以你(nǐ)始料未及的(de)方式使用(yòng)你(nǐ)的(d↕∞♣e)應用(yòng)。”

  Martin Fowler十分(fēn)贊同§₽↔David的(de)觀點,但(dàn)在同一(y✔&ī)番對(duì)話(huà)中,Kent Beck的(de)措詞顯得(de)‍σ更為(wèi)謹慎。但(dàn)他(tā)也(yě)同意,在QA這(zhè) →方面,“事(shì)情的(de)≤±≠®發展已經趨向于另一(yī)個(gè)極端&rd♣↕®←quo;。如(rú)果你(nǐ)無法預見(jiàn) ​到(dào)所有(yǒu)的(de)可(kě)能(néng)性,那(nà™×£✔)麽從(cóng)外(wài)部獲取某些(xiē)反饋的"​(de)做(zuò)法“非常有(yǒu)意義”。φ ‍♣

  TDD團隊中的(de)測試與團隊組成

  在以上(shàng)對(duì)話(↓±​huà)的(de)較後,我們已意識到(dào)在TDD的(de)實施♥÷中,除了(le)在編程過程中所創建的(de)測試外(wài),進行(§​αxíng)一(yī)定其他(tā)形式的(de)測試工(gōng)作(zuò)<♦♥™仍是(shì)有(yǒu)意義的(de)。敏捷測試的(de)概念在&l ÷dquo;敏捷測試”(Crispin,Grego $¥ry 2009)等書(shū)籍中進行(xí₽§♥​ng)了(le)詳盡的(de)描述。但(dàn)實施敏捷σ∑ 測試是(shì)否仍然需要(yào)“測試人(rén)員(y✘§★uán)”,即專業(yè)從(cóng)事(shì)測試的(d∞φΩσe)員(yuán)工(gōng),人(rén)們σ✔對(duì)于這(zhè)一(yī)點似乎還(hái)有(yǒu)争論•☆。Google仍然有(yǒu)數(shù)百名測試人(rén)員(yuán♦→£),而Facebook幾乎完全沒有(yǒ♦‌u)設立測試人(rén)員(yuán)的(de)職位。

  而普通(tōng)的(de)公司則有(yǒu)著(zhe ±λ)不(bù)同的(de)考慮,他(tā)們必須保證員₹®(yuán)工(gōng)已掌握了(le)工(gōng)具與概∏↔÷念方面的(de)知(zhī)識以開(kāi)發并維護各種應÷®用(yòng),并确保高(gāo)效的(de)分(f≠®ēn)工(gōng)。讓我們實際分(fēn)析一(yī↕↕σ✔)下(xià)在Java環境中引入測試人(rén)員(yuáλΩn)意味著(zhe)什(shén)麽。

  支持Java的(de)TDD工(gōng≠→)具包括JUnit與某種模拟測試框架,一(yī)般的(de)開(kāi)≤∏₩發者都(dōu)能(néng)夠掌握這(zhè) ‌φ些(xiē)工(gōng)具。不(bù)過,JUnit框架不©≥(bù)僅支持在Java環境中應用(yòng)TDD,它還(hái)表現(xi ♠₽♥àn)出了(le)測試工(gōng)作(zuò)的©≠₽Ω(de)第二次革新:它不(bù)僅支持自(zì)動化(huà)單元測試,還(hπ©∞¶ái)支持其他(tā)各種測試的(de)↔←λ自(zì)動化(huà)。

  JUnit目前還(hái)支持運行(xε↓₹φíng):通(tōng)過JAX-RS實現(xià±→λ•n)的(de)集成測試、自(zì)動驗收測試、基于✘≤Selenium Webdriver的(de)UI測₽>試、以及支持各種數(shù)據集的(de)參數 φ×(shù)化(huà)測試等等。并且這(zhè)£®些(xiē)測試都(dōu)能(néng)夠與持續集成(₩✘↕ΩCI)方案進行(xíng)整合。

  除了(le)這(zhè)些(xiē)測試工¥  (gōng)具之外(wài),其他(tā)各種工(gōng)具與框¥♦↑架也(yě)大(dà)量湧現(xiàn)。可(kě)以說(shuō),一​≠¥(yī)般的(de)開(kāi)發者很(hěn)難掌握在一(yδ¥ī)個(gè)普通(tōng)的(de)現(xiàn)代化(♠ •huà)項目中所用(yòng)到(dào)的(de)全部工(↑&γ₹gōng)具。

  概念性的(de)知(zhī)識是(shì)創建高(gāo)₹$質量應用(yòng)的(de)基本。要(yào)實現(xiàn)高•Ω≈™(gāo)可(kě)維護性,開(kāi)發者需要(yào)了(le)解代碼π₹☆®整潔之道(dào),而要(yào)掌握這(zhè)方面知(zhī​ )識需要(yào)多(duō)年(nián)‌Ω的(de)經驗積累。如(rú)果我們想要(yào)•α​精通(tōng)這(zhè)一(yī)領←←¥域的(de)知(zhī)識,接下(xià)來(l✔•ái)還(hái)可(kě)以學習(xí)設計(jì)模式、線程以&★Ω±及性能(néng)的(de)原理(lǐ)。

  準确的(de)、可(kě)維護的(de)π→σ以及高(gāo)性能(néng)的(de≠¶¶​)代碼雖然十分(fēn)重要(yào),"​≥但(dàn)他(tā)們并不(bù)能(néng)保證某個÷β‍(gè)應用(yòng)是(shì)可(kě)信¶✘ 賴的(de)。為(wèi)了(le)彌補這(zhè)方面的₹  (de)缺失,開(kāi)發者還(hái)需要(yào)學'¶<£習(xí)安全方面的(de)知(zhī)識>÷™。而為(wèi)了(le)創建一(yī)個(gè)能(né♣&ng)夠吸引用(yòng)戶的(de)應用(yòng₹¥),開(kāi)發者還(hái)要(yào)了(le)解UX₩α方面的(de)知(zhī)識。較後,為(wèi)了(le)♠↑β∏設計(jì)一(yī)種高(gāo)效的(de)方式以保證以©♠♠上(shàng)所說(shuō)的(de)特性,開(kāi)發者還(h×★ái)需要(yào)熟悉測試的(de)知(zhī₹¶)識。

  在組建IT部門(mén)時(shí),工(gλ​ōng)作(zuò)的(de)分(fēn)工(g✘¥>>ōng)是(shì)又(yòu)一(yī)項要(yào)考慮的(d'•←‍e)重點。在團隊的(de)專業(yè)構成£φ≠♣中,我們可(kě)以選擇由各領域的(de​¶✔)專家(jiā),例如(rú)由一(yī)位安全方面的(de)專家(ji♕)、一(yī)位UX設計(jì)師(shī)和♥÷(hé)一(yī)位測試人(rén)員(yuán)組↕±成一(yī)個(gè)團隊,但(dàn)這(zhè)樣一(yī)來(lá ÷" i)就(jiù)沒有(yǒu)編碼者的(♥Ω→•de)位置了(le),結果就(jiù)是(shì)團隊無$♠法産出任何實際的(de)東(dōng)西(xī)。​&

  反過來(lái),我們也(yě)可(<™kě)以由多(duō)面手構成整個(gè)團隊,但(dàn)這(zhè)意味≤γ®β著(zhe)整個(gè)團隊必須将較好(hǎo)的₩‌(de)光(guāng)陰花(huā)費(fèi)在學習(x‍≠í)上(shàng),除非他(tā)們都(dōu)是(shì)天才。這(zhè ÷)樣的(de)團隊同樣不(bù)會(huì)有(yǒu)很(hěn)高(g∏♣āo)的(de)産出。

  因此,我們的(de)結論是(shì)在開(<• σkāi)發團隊中有(yǒu)必要(yào)引入部分(fēn)專利性π↔'。我們不(bù)能(néng)指望每個(gè)開(kāi)發者γ$不(bù)僅能(néng)夠掌握全部的(de)工(gōng)具∏₽,并且還(hái)是(shì)整潔代碼、UX以及安全和(hé)測試方面÷•的(de)專家(jiā)。另一(yī)方面,在團隊中引入的(de)™&π∏專家(jiā)數(shù)量也(yě)應有(≥♠™£yǒu)所限制(zhì)。

  既然我們必須引入一(yī)定的(de)>₹β專業(yè)性,那(nà)麽設置一(yī)位測試專家(jiā)是(shì)比÷ ☆λ較有(yǒu)意義的(de):對(duì)于開(kāi)發者Ω↑±•來(lái)說(shuō),如(rú)果讓他(↕↔₹tā)們來(lái)選擇,那(nà)麽大(dà)多(dσ✔uō)數(shù)人(rén)不(bù)會(huì)去(qù)探索單元測↔≥→'試之外(wài)的(de)內(nèi)容,甚至有(yǒ≤β≥u)很(hěn)多(duō)人(rén) δ根本不(bù)願意承擔任何測試工(gōng)作(zuò)。這(zh✔¥≠è)也(yě)是(shì)為(wèi)什(shén)麽許多(duō)開(k≈∑£εāi)發者不(bù)喜歡、甚至是(shì)厭(yàn)惡測試 α¶♣的(de)原因。如(rú)果要(yào)在這(zhè)種環境中©>π↔嘗試轉變為(wèi)敏捷測試實踐,那(nà)麽就(j¶÷¥★iù)需要(yào)設立一(yī)位對(duì)于測試工(gōng)作(z®£uò)有(yǒu)熱(rè)情并樂(yuè)于實現(xiàn)它的(de)專☆≤δ€家(jiā)。

  與TDD的(de)實施類似,以上(sh®•àng)過程同樣需要(yào)他(tā)人(rén)的(de)指導,并且↕ σ向團隊展示其工(gōng)作(zuò)結果。如(rú)果某位測≠ ™試專家(jiā)創建了(le)對(duì)某個(gè)服務的(de)λ∞→€測試集,并且能(néng)夠從(cóng)IDE中執行(∏↔ xíng),那(nà)麽程序員(yuán)就(jiù)很(hěn)γ 可(kě)能(néng)會(huì)去(qù)使用(yòng)。不(b  ✘ù)僅如(rú)此,如(rú)果開(kāi)發者感受到(dào)了(le)測試↕≠÷•的(de)實用(yòng)性,那(nà)麽他(tā)們就(≥¥jiù)會(huì)開(kāi)始擴展其功能(nén★  g),并以可(kě)維護的(de)方式實現♣™(xiàn)。一(yī)旦為(wèi)測β→±試所觸動之後,程序員(yuán)就(jiù)會(huì)願意繼續進行(xín₹♣g)測試。但(dàn)以我的(de)經驗來(lái)看(kàn),僅靠程序員(★₹yuán)自(zì)己是(shì)無法感受到(dà™Ωo)測試的(de)好(hǎo)處的(de)。

  TDD:具有(yǒu)紮實技(jì)術(shù)×✔背景的(de)測試人(rén)員(yuán)

  在QA的(de)興衰這(zhè)一(yī)節的(de)總結部分(fēn£∏),我曾表示:在實現(xiàn)了(le)對(duì)手工(gōng≈¶↔↕)檢查工(gōng)作(zuò)進行(xí€‍ng)自(zì)動化(huà)的(de)TDD環≥‍境中,對(duì)于缺乏技(jì)術(shù)知(zhī)識的(de)‍≈±傳統測試人(rén)員(yuán)的(de)需求已經大(dà)大(dà)降低∏®₹(dī)了(le)。随後在對(duì)JUnit與TDD的(de)介紹中,✔↔§₹我們又(yòu)看(kàn)到(dào)開(kāi)發者創建了(le)大('£×dà)量的(de)測試工(gōng)具,而缺乏技(jì)術σ£ (shù)知(zhī)識的(de)測試人(rén)員♦Ω(yuán)将無法使用(yòng)這(zhè)些(xiē)工(gεσ↔£ōng)具。

  我們現(xiàn)在可(kě)以負責任的(de)說± §σ(shuō),在TDD環境中,我們需要(yàΩσo)一(yī)種新型的(de)測試人(rén)員(yu♣₽án),他(tā)們需要(yào)具備更紮實的(de)技(jì)術(sh•σù)背景。至于他(tā)的(de)日(rì)常活動包×§括哪些(xiē)內(nèi)容,要(yào)考慮¥← 到(dào)TDD所實施的(de)環境。對(duì)于敏捷測試來(lá>>&εi)說(shuō),TDD實現(xiàn)了(le)自(z←↓•ì)動化(huà)金(jīn)字塔(Cohn 200$≥≤9)的(de)底層,以及測試象限(testing qu♥<±εadrants)的(de)第1象限(Marick 2003及Crisp♦¥‌in 2009)。

  為(wèi)了(le)更清楚地(dì)了(lπφ∞e)解其效果,讓我們來(lái)考慮這(zhè)個(gè)測試₩πε場(chǎng)景:某個(gè)表單的(de)一(yī÷★)個(gè)輸入框可(kě)以接受一(yī)個(♦≤↔gè)整數(shù),該數(shù)字必須在規定的(de)邊界之內(↑σβ₹nèi),并且要(yào)進行(xíng)後端的(de)校(x♦®±>iào)驗。我們在此處可(kě)以建立16種功能(néng)性的(>‌<de)測試用(yòng)例:{ x | boundary,boundarδ'y-1,boundary+1,decimal, locale,Z,0,nullα→,“”,“ &ldquo∞≥≥​;,abc,UTF-8,2^31-1,2^31, -2^31,-↕∞≥2^31-1},但(dàn)這(zhè)些(xiē)基本的(d'÷♣δe)單元測試隻屬于測試象限中的(de)第1象限(通(t₹βōng)過面向技(jì)術(shù)的(de)測試指導開(kāi)發±← ↔)。

  而在TDD實踐中,以上(shàng)測試用(yòng)例将實現(xλλ☆iàn)自(zì)動化(huà),測試人(réβ<n)員(yuán)不(bù)應(參照(zhào)上φφ∑(shàng)文(wén))執行(xíng)這(zhè)些(xiē)測試用(y≤β‍εòng)例。一(yī)般來(lái)說(shuō),他(tā)應當對(du€∑φ€ì)于該輸入字段是(shì)否存在以及一(yī)個(gè)正面用(yòngΩ™☆$)例進行(xíng)校(xiào)驗(測試象限2,通(tōngβ®δγ)過面向業(yè)務的(de)測試指導開(kāi)發)。雖然可(k✔δ☆ě)以通(tōng)過某種錄制(zhì)與播放(fàng)÷∞¶ε工(gōng)具完成該任務,但(dàn)這(zhè)種方案缺乏可(kě)維✘♠★λ護性。更有(yǒu)效的(de)技(jì)術(shù)方案是(shì)(通(t ♠ōng)過整潔的(de)代碼)編寫Selenium Webdri±Ωver代碼,并且讓它能(néng)夠在整個(gè)團隊共用(yòng)的(d§ ✘e)IDE中執行(xíng)。

  象限2中的(de)其他(tā)測試技(jì)術(shù)包括用(yònε"g)戶故事(shì)的(de)測試,而這(zhè)些(xiē)測試同™✔✔↓樣可(kě)以實現(xiàn)自(zì)動化(huà)γ♦♣ 。“作(zuò)為(wèi)↕§εInfoQ的(de)用(yòng)戶,我希望能(néng)夠登錄系統,以下π"​(xià)載某些(xiē)特别的(de)內(nèi)容&r&®ε dquo;這(zhè)樣的(de)行(xíng)為(wèi)可(k☆βě)以暴露為(wèi)REST調用(yòng <↔')等方式,并通(tōng)過自(zì)動化(huà)測∑σ∑試執行(xíng)。對(duì)于在GUI層進行(xínα$δ∞g)的(de)這(zhè)種簡單測試,有(yǒu)人(rén)可(k&↑ě)能(néng)會(huì)選擇使用(yòng)外(wài)部工(gōng)×±具(例如(rú)SoapUi)。但(dàn)更高δ✔§™(gāo)效的(de)做(zuò)法是(shì)讓這(z 'hè)個(gè)測試能(néng)夠在JUnit↔≠中作(zuò)為(wèi)集成測試(“LogInIT.♣  java”)而運行(xíng)。而其他(tā)(沒有(♦$yǒu)許可(kě)證的(de))團隊成員(yuán)可(kě)以直接運↕★行(xíng)與維護該測試,并且無需學習(xí)該'¶πδ工(gōng)具的(de)使用(yòng)。

  當基本功能(néng)都(dōu)實現(xiàn)了→↕(le)自(zì)動化(huà)檢查後,我們就(jiù)•£↓→達到(dào)了(le)第3象限(通(tō✔​₹ng)過面向業(yè)務的(de)測試來(lái)評價産品)γεε₽:團隊已具備了(le)開(kāi)始進行(xín♣Ω÷g)探索性測試的(de)先決條件(jiàn)。D¶¶avid Heinemeier Hansson在上(shàng)述對(duì₽©")話(huà)表示,用(yòng)戶會(huì)以你(nǐ‍σ∞≤)始料未及的(de)方式使用(yòng)你(nǐ)的(de)應用(αβ×yòng)。這(zhè)一(yī)點對(duì)于其他(tā)系統也(y✘₹₩ě)成立,此時(shí)這(zhè)種方式叫做(zuò)♦¶突現(xiàn)行(xíng)為(wèi)(e↔φ♠÷mergent behavior)。由于≠α你(nǐ)不(bù)知(zhī)道(dào)應該期望怎樣的(de)λ 行(xíng)為(wèi),因此此處可(kě)引入探索性測試(Hendric₩★  kson 2013)。

  探索性測試(ET)依賴于小(xiǎo)型的(de)叠代:執行(xíng ₽↓∞)測試、對(duì)應用(yòng)進行(xíngε≈₹₽)學習(xí)并為(wèi)此設計(jì)新的(de)測試。這(zhè)種測ε•±✔試方式較初是(shì)受到(dào)Tes÷✔&t Heuristics Cheat sh<×eet((Hendrickson 2006))這(zhè)份非常容易獲取的(d&≈πγe)資料而啓發的(de),但(dàn)并不(bù)是(sφ±hì)說(shuō)隻需簡單地(dì)執行(xíng)其☆λ中的(de)內(nèi)容就(jiù)代表你(nǐ)已經 ‍δ✔實現(xiàn)了(le)探索性測試。探索性測試的(≤♥de)真正價值在于它的(de)叠代式特征ε‌以及對(duì)于知(zhī)識的(de¶§↑©)運用(yòng)。

  舉例來(lái)說(shuō):在He♦∏↕≈uristics Cheat Sheet中提到(dào),在wγ♦∏¶eb測試中可(kě)以“對(duì)url進行(xíng§π)各種操作(zuò),(例如(rú)變更或删除某些(xiē)參數(sh¶™σù))”。如(rú)果在沒有(yǒ÷↑u)準備的(de)情況下(xià)直接嘗試編寫相(xiàng)關的(de)腳本​&或直接執行(xíng)是(shì)沒有(yǒu)實↔σ用(yòng)性的(de)。如(rú)果要(yào)改善這♠ ↕(zhè)方面的(de)行(xíng)為(δ εwèi),我們可(kě)以首先用(yòng)幾個(gè)叠代的(de)時(sh&'​í)間(jiān)去(qù)學習(xí)該應用(yòng)使用(yòng)₹→這(zhè)些(xiē)參數(shù)的(de)方式,随後≠★γ≥想出(設計(jì))一(yī)個(gè)相(xiàng)關的(de)測試,較後₹$☆≠才開(kāi)始測試(執行(xíng))。毫無疑問(wèn),如(r€ ↕ ú)果能(néng)夠正确地(dì)運用(yòng)http協議±λ(yì)方面的(de)知(zhī)識,對(duì)于該₩"<測試的(de)設計(jì)将帶來(lái)極大(dà)的(de)Ω₹♥✘便利。

  我在探索性測試中的(de)常用(yòng)&× ↔做(zuò)法是(shì):在IDE中運行(xíng)應用(yòng♦±‍)程序、對(duì)應用(yòng)程序服務器(q≤↔ì)的(de)日(rì)志(zhì)進行(xíng)監控、打開(kāi)數↔₽​(shù)據庫并對(duì)網絡請(qǐng)→✔≈↔求進行(xíng)監控。這(zhè)種方式顯然能(néng)π≤夠看(kàn)到(dào)一(yī)些(xiē)在GUI中不(bù)會(hu∏<γ≈ì)顯示出來(lái)的(de)錯(cuò)誤♦♠。通(tōng)過這(zhè)種方式,我通(tōng)π☆常能(néng)夠發現(xiàn)這(zhè)些(xλ≈iē)內(nèi)容:大(dà)量的(de)網絡錯(cuò)誤與請(qǐng)‍α求、日(rì)志(zhì)污染、非預期的(de)持久行(xí≈≤ ng)為(wèi)、大(dà)量的(de)/∞¶₩∑低(dī)效的(de)數(shù)據庫查詢、安全性隐患以及€α 使用(yòng)性的(de)錯(cuò)誤等等。

  這(zhè)并不(bù)是(shì)說(s¥↕≠huō)一(yī)旦應用(yòng)了(le)TDD,所有(yǒu)的(d✔↕e)測試工(gōng)作(zuò)就(jiù)會(huì)變得✔&₹(de)充滿技(jì)術(shù)性,或是(shì)由工(gōng)具 ₽所驅動。依然有(yǒu)一(yī)些(xiē)非常重要(yào)的(de)測試 ‍"與人(rén)相(xiàng)關(Ambler 2ε♦≤003-2014),或是(shì)與UX的(de)測♥₩∞試相(xiàng)關。這(zhè)些(xiē)測試所包含的(de)技₹☆&"(jì)術(shù)性較少(shǎo),但(dàn)并不(bù)意味↓≥∏著(zhe)就(jiù)不(bù)需要(yào)了(le)解§&π 深入的(de)知(zhī)識。

  以上(shàng)內(nèi)容表示,TDD讓測試人(rén)員(yuáβ∏✘←n)的(de)角色發生(shēng)了(β★le)變化(huà),而不(bù)再需要(yào)進行(xín ∏&g)手工(gōng)功能(néng)性測試(例如(r←₹ú)檢查)。雖然他(tā)仍有(yǒu)大(dà)量¥ 的(de)工(gōng)作(zuò)需要(yγ≠εào)完成,但(dàn)他(tā)所負責的(de)功能(néng)性測♥α©試應該已經實現(xiàn)了(le)自(zì)↔φ動化(huà)。而如(rú)果他(tā)能(ε✔ε¥néng)夠掌握更多(duō)的(de)技(jì)術(shù)、工(gō™‌&≥ng)具或其他(tā)方面的(de)知(zhī)識,那₽₽☆<(nà)麽他(tā)的(de)手工(gōng)(探索性)測試工∏<¶(gōng)作(zuò)很(hěn)可(kě≠©)能(néng)會(huì)變得(de)更為(wèi)高(gāo)效,隻是(±'≤€shì)這(zhè)些(xiē)知(zhī)識往往并不(bβ←ù)容易掌握。

  那(nà)麽,TDD團隊中的(de)測試人(rén)員₩€(yuán)究竟應當掌握哪些(xiē)技(jì)術(sh÷ ₽ù)方面的(de)知(zhī)識呢(ne)?以下(xià)陳述基本是(‌•¶shì)沒什(shén)麽疑問(wèn)的(de):敏捷測 ®試人(rén)員(yuán)需要(yào)掌握良好(hǎo)的(de←‍ )技(jì)術(shù)知(zhī)識,了(le)解如(rú)何與他(tā↕ ≠ )人(rén)合作(zuò)進行(xíng)自(zì)動化(huà)測試,ασ≠而成為(wèi)經驗豐富的(de)探索性測試人(rén)員(y© ∏uán)(Crispin, Gregory 2009)對(duì)于>"$TDD團隊來(lái)說(shuō)同樣有(yǒu)意 ★<義。

  但(dàn)我卻相(xiàng)信,對(du♦♣ì)于已開(kāi)始實踐TDD的(de)敏捷團隊與尚未開(kāi)始實δ≤踐TDD的(de)敏捷團隊來(lái)說(shuō),他 ♦>∞(tā)們對(duì)于職務的(de)需求也÷α∏☆(yě)是(shì)不(bù)同的(de)≤&。對(duì)于尚未開(kāi)始TDD的(de)團隊來(lái)說(shuō ☆≤),敏捷測試人(rén)員(yuán)也(yě)許将$×<被迫使用(yòng)某些(xiē)不(bù)為(wèi)開(kāβ✔↑i)發人(rén)員(yuán)所用(yòng)的(d∏σφ≈e)測試工(gōng)作(zuò),或是(shì)進行(xíng)≈ 大(dà)量的(de)手工(gōng)測試。而在TDD團隊中∞€,測試人(rén)員(yuán)更有(yǒu ∞)可(kě)能(néng)在IDE中進行(xíng)工(gōng)作(zuò)‌♠φ♦,這(zhè)時(shí),該角色的(de)★≥技(jì)術(shù)需求就(jiù)變≤™←"為(wèi):

  掌握至少(shǎo)一(yī)門(mén•↕≤)編程語言(從(cóng)而能(néng)夠閱讀(dββ♥ú)及編寫測試)。

  了(le)解命令行(xíng)與腳本編寫的(de)知(zhī)識(包括€☆₹>服務器(qì)與本地(dì)機(jī)器(qì))。

  具備數(shù)據庫方面的(de)經驗(用(yòng)于在沒有(yǒu)×♥∏GUI的(de)情況下(xià)檢查持久化(huà)的(de)情況)∏§♦。

  結語

  本文(wén)引用(yòng)了(le)Kent B≈™&eck、Martin Fowler和(hé)David HeiΩ×nemeier Hansson的(de)對(duì)話(huà) ®<★,這(zhè)也(yě)是(shì)激勵我撰寫本文(wé ©∞÷n)的(de)動力。如(rú)果你(nǐ)對(duì)αδ™☆于測試有(yǒu)興趣,應該聽(tīng)一(yī)聽(t♠•īng)他(tā)們對(duì)于“将代碼扔給Q<∑A”以及“老(lǎo)派的(de)QA做(Ω€€zuò)法還(hái)不(bù)如(rú)不(bù)‌​要(yào)QA”等觀點坦率而直接的(de)表述。Ω∞

  為(wèi)了(le)對(duì)此問(wèn)題進行(xíng)↓♠透徹的(de)分(fēn)析,我首先描述了(le)老(lǎo)派的(de)功 <能(néng)性測試方法,它所造成的(de)結果不(bù)經過思考的(d₹✘↔∏e)功能(néng)檢查,這(zhè)種方式帶來(lái)的(de÷ ')傷害更大(dà)于它的(de)價值。這( ''zhè)并非我的(de)臆想,而是(shì)有(yǒu)強烈的(de)迹象 ‍'×表明(míng)仍有(yǒu)許多(duō)​£↕組織以這(zhè)種方式進行(xíng)測 ↑試,無論他(tā)們是(shì)否采用(yò∞✔∑≠ng)了(le)“敏捷”實踐。

  接下(xià)來(lái),我指出了(le)為(wèi)什(s≈λπ£hén)麽将TDD開(kāi)發者與&ldq®∑&∏uo;老(lǎo)派的(de)功能(nénλ♠g)測試人(rén)員(yuán)”結合在一(yī)起是(shì↕Ω→)一(yī)種不(bù)推薦的(de)方式。在團隊組∏  ∏成那(nà)一(yī)部分(fēn),我對(duì)于在TDD團隊中設置測試人✘¥(rén)員(yuán)的(de)角色持保留态度,并将其修正₽©≠為(wèi)在團隊中應當設立一(yī)些(xiē)對(duì)于測試充↓γ滿熱(rè)情的(de)成員(yuán)。

  至于測試人(rén)員(yuán)所需的(de)技(j™©ì)能(néng),我認為(wèi)在TDD過程中已不(bù)需要(≠€yào)進行(xíng)老(lǎo)派的(de)功能(néng)性檢查。在≤✘↑TDD團隊中仍然有(yǒu)測試人(rén)員(yuán)的(de)一(φ☆∑yī)席之地(dì),但(dàn)他(tā)們的(de)測試工•≠  (gōng)作(zuò)需要(yào)更專業(yè)的(de↓"$¶)技(jì)術(shù)知(zhī)識。

  收獲

  如(rú)果你(nǐ)是(shì)一(yī)位仍在進行(xíng)手工(™'εgōng)檢查的(de)測試人(rén)員(yuán),那"©↑(nà)麽應當考慮TDD或其他(tā)能(néng)夠将σ→手工(gōng)檢查自(zì)動化(huà)的(de)解決方案。如(rú)果你δ↑✔(nǐ)還(hái)不(bù)具備上(shàng)文(wén)所提到♣ (dào)的(de)技(jì)術(shù★←)知(zhī)識,那(nà)麽是(shì)時(shí)候将你(nǐ)±<α的(de)知(zhī)識水(shuǐ)平提升至這(zhè)一(yī)程度,從(♣•↕​cóng)測試工(gōng)作(zuò)中>≤α獲得(de)更大(dà)的(de)樂(yuè)趣!《More♣₹ Agile Testing》(Crispin Gregory 2015)>‌一(yī)書(shū)對(duì)于應當具備的(de)知(zhī)★↑識進行(xíng)了(le)詳盡的(de)介紹,我極力推薦這(zhè)本書(s®>hū)給那(nà)些(xiē)希望繼續從(cóng)事(shì)測試工(gπ≥↔→ōng)作(zuò)的(de)讀(dú)者們。為(wèi)了(le)&↓掌握這(zhè)些(xiē)知(zhī)識,我建議(yì)大(dà)家≠∑±α(jiā)進行(xíng)正規的(de)學習(xí),它會(↕♥huì)讓你(nǐ)更好(hǎo)地(dìαα÷)了(le)解某個(gè)主題,并且加快(k₩'•uài)學習(xí)的(de)速度,同時(shí)也(yě)使你(nǐ)有(y∑  ≥ǒu)機(jī)會(huì)證明(míng)自(>☆‌↓zì)己已具備了(le)這(zhè)些(xiē)知(z §hī)識。

  如(rú)果你(nǐ)是(shì)一(y ©γ∞ī)位團隊主管或經理(lǐ),并且對(du쥕®")于測試方面的(de)問(wèn)題感到(dào)受挫,那(¥ nà)麽你(nǐ)或許應當考慮一(yī)下(xià)如(rú)何實現(xΩ€​¥iàn)更高(gāo)級的(de)測試方案。你(nǐ)需要(yào)的(de∑ δ)是(shì)在團隊中找到(dào)能(néng)夠實現(xiàn§≠≠)方案,同時(shí)又(yòu)對(duì)測試充 ∞滿熱(rè)情的(de)人(rén)。在“程序員(yuán)即 ₹測試人(rén)員(yuán)?”(Prog✔£rammers as Testers?)這(≈↔♣×zhè)篇文(wén)章(zhāng)(Gregory 20£π∞11)中,Janet Gregory表示她(tā)傾向于測試人(rénβ≥≤π)員(yuán)應當具備技(jì)術(shù)背景的(d α↑e)觀點,但(dàn)如(rú)果他(tā)們将測試人(rén)員(&λyuán)的(de)角色僅僅當作(zuò)成為(wè×÷✘♦i)程序員(yuán)的(de)一(yī)塊墊腳石,那(n£↑βà)麽就(jiù)不(bù)要(yào)以♥→♠®測試人(rén)員(yuán)的(de)身(shēn)份招聘≈∏¶∞他(tā)們。這(zhè)一(yī)點無可(kě)厚非,如(rú)果♦β↔測試人(rén)員(yuán)對(duì)于測試工(gōng)作(•‌↔zuò)沒有(yǒu)熱(rè)情,他(tā)ε'們就(jiù)無法很(hěn)好(hǎo)地(dì)實現(xiàn)測試象∑​₽£限或探索性測試。反過來(lái)說(shuō),如(rú)果某個(gè)測ββ∑∏試人(rén)員(yuán)不(bù)具備必需的(de)技(jì)能( ×≈néng),他(tā)就(jiù)無法實現(xi γàn)測試自(zì)動化(huà),甚至在探索性測試中也(yě)做(zuò​σ✘✘)不(bù)到(dào)完全高(gāo)效。換句話(huà₽∏Ω)說(shuō),技(jì)能(néng)與熱(rè)情是(shì)實施敏 →  捷測試的(de)必要(yào)條件(jiàn)↔☆Ω‍。

相(xiàng)關文(wén)章(zhān♣♣Ω¶g)推薦
下(xià)一(yī)代工(gōng)業(yè)進步βγ被稱為(wèi)工(gōng)業(yè)4.0,旨在将傳統行(xíng)業← (yè)(如(rú)自(zì)動化(huà))互聯₹≥互通(tōng)并實現(xiàn)計(jì)算(suàn)機(jī)化(↑®huà)。工(gōng)業(yè)4.0的(de)目标是(shì)使♠≈∏ 工(gōng)廠(chǎng)變得(de)更加智能(néng),‌≤ ←提高(gāo)适應性和(hé)資源效率,以及改善工(gōng)廠(chǎng↓€ ∞)之間(jiān)供...
您正在尋找能(néng)夠将您令人(rén)驚歎的(de)應用(☆∞&∞yòng)程序想法變為(wèi)現(xiàn)實的(de)人(rén)。我應該 α≥聘請(qǐng)軟件(jiàn)公司還(hái)是(shì)λ'≈π兼職開(kāi)發者?這(zhè)可(kě)能(néng©♦$)是(shì)每個(gè)新晉産品所有(yǒu)者問(wè"‌ n)自(zì)己的(de)最常見(jiàn)問(wèn)題↔₩♦。在開(kāi)始開(kāi)發過程之前,您需要(♣¥yào)...
從(cóng)頭開(kāi)始構建網站(zhàn)并托管和↑★→(hé)維護或改造舊(jiù)網站(zhàn)需要(yào)聘‌±∞請(qǐng)一(yī)支擁有(yǒu)技(jì)能(né‌÷✘≤ng)和(hé)專業(yè)知(zhī)識的(de) λφ團隊。如(rú)果您不(bù)想進一(yī)步擴大(dà)團隊,不(×¶₽φbù)想經曆招聘大(dà)手筆(bǐ),或者想降低(dī)離(lí)岸₹ ​成本,北(běi)京軟件(jiàn)開(kāi)發外(wài)包...
物(wù)聯網 ( IoT ) 概念首次出現(∑↕λ¥xiàn)時(shí),曾有(yǒu)大(dà∏∑≥☆)膽預測稱,到(dào) 2020 年(nián),物(wù)聯網連•δ β接設備數(shù)量将達到(dào) 500 億甚至數(shù)>‌ γ萬億。這(zhè)些(xiē)極高(gāo)的(de)估值引發了(le)"≠φ炒作(zuò),但(dàn)最終被證明(mín&•πg)...
下(xià)一(yī)代工(gōng)業(yè)進Ωβ§<步被稱為(wèi)工(gōng)業(yè)4.✔✔↓σ0,旨在将傳統行(xíng)業(yè)(如(rú)自(zì)動化(huà)‍α♠)互聯互通(tōng)并實現(xiàn)計(jì)算(s≤δuàn)機(jī)化(huà)。工(gōng)業(yè)4.0的(de)目标←¶是(shì)使工(gōng)廠(chǎng)變得(de)更 ‌±↑加智能(néng),提高(gāo)适應性和(hé)資源效率, ¶以及改善工(gōng)廠(chǎng)之間(®<÷jiān)供...
企業(yè)需要(yào)強大(dà)且可(↔ ↑☆kě)靠的(de)在線形象才能(néng)取得(de)成功。Magent↕ o 已成為(wèi)領先的(de)電(diàn)子(zǐ)商務€♦↔平台,為(wèi)各種規模的(de)企業(yè)提供強大™≤(dà)的(de)功能(néng)和(hé)定制(zhì)選項。•'對(duì)于希望通(tōng)過基于 Magento ...
經由過程抗衡演練該部在新聞化(huà)條件(jiàn)下(xià)↑♦"戰場(chǎng)感知(zhī)、新聞傳輸、火(huǒ)力打擊和₩✘£±(hé)指揮職掌才幹大(dà)大(dà)加強,軟件(jiàn)誘導。新聞₹∞£化(huà)為(wèi)鐵(tiě)甲插翅,∞÷≤π我不(bù)大(dà)白(bái)北(běi)京軟≈♠件(jiàn)誘導。将藍(lán)方逼向絕路(lù)末路(lù)✔<​‍。北(běi)京。...
日(rì)前,騰訊在“互聯網技(jì)術(φ § shù)提升民(mín)生(shēng)服務”的(deα‍<≠)發布會(huì)上(shàng)啓動名為(wèi)“騰愛(ài)”的(∞&✔™de)互聯網+醫(yī)療戰略。“騰愛(ài)醫(yī)®♦♠生(shēng)”定位為(wèi)醫(yī)生(shēng)®§≤​群體(tǐ)提供專業(yè)的(de)互聯網服務。...
北(běi)京軟件(jiàn)開(kāi)發公司已經♠≠π↕開(kāi)發出一(yī)種新的(de)軟件(jiàn)來(l&§ái)預測海(hǎi)洋、水(shuǐ)庫和(∞φ≥×hé)河(hé)流中的(de)污染源的(de)系統§↕"↑...
随著(zhe)新的(de)城(chéng)市(shì)網絡分(fēn)析軟α↕✔≈件(jiàn)插件(jiàn)從(cóng)北(běi)京軟件(jià€&n)開(kāi)發公司,建築師(shī)和(hé)城(♠'₹chéng)市(shì)規劃者可(kě)以用(yòng)數(shù↓Ω)學網絡分(fēn)析方法來(lái)描述城(chéng)市(shì)™€的(de)空(kōng)間(jiān)格局。在這(zhè)裡(lǐ™₽"₹),從(cóng)一(yī)個(gè)插件(j♣‌iàn)的(de)屏幕截圖顯示無障礙公共運輸(公共...
北(běi)京軟件(jiàn)開(kāi£> ≈)發公司認為(wèi)信息和(hé)軟件(jiàn)技(jì)術(shù)£→"₹的(de)重點是(shì)研究和(hé)經驗,.₹δ..
北(běi)京軟件(jiàn)開(kāi)發32T塊存儲分(f'"δēn)區(qū)操作(zuò)手冊,以下(xià)分‍±× (fēn)别針對(duì) Linux 和(hé) Wiδ™↕γndows 的(de) ECS 實例來(lái)‍©介紹大(dà)盤的(de)管理(lǐ)和(σ↕hé)使用(yòng)。 大(dà)數(shù)據 ®π±盤的(de)分(fēn)區(qū)和(hé)文(wén)件(ji↑>∏‌àn)系統格式化(huà)和(hé)小(xiǎ'♦o)盤都(dōu)存在差異。大(dà)盤必須采用($≈↕yòng) GPT 分(fēn)區(qū)格...