-
Notifications
You must be signed in to change notification settings - Fork 3
/
Questions.html
572 lines (493 loc) · 24.8 KB
/
Questions.html
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
347
348
349
350
351
352
353
354
355
356
357
358
359
360
361
362
363
364
365
366
367
368
369
370
371
372
373
374
375
376
377
378
379
380
381
382
383
384
385
386
387
388
389
390
391
392
393
394
395
396
397
398
399
400
401
402
403
404
405
406
407
408
409
410
411
412
413
414
415
416
417
418
419
420
421
422
423
424
425
426
427
428
429
430
431
432
433
434
435
436
437
438
439
440
441
442
443
444
445
446
447
448
449
450
451
452
453
454
455
456
457
458
459
460
461
462
463
464
465
466
467
468
469
470
471
472
473
474
475
476
477
478
479
480
481
482
483
484
485
486
487
488
489
490
491
492
493
494
495
496
497
498
499
500
501
502
503
504
505
506
507
508
509
510
511
512
513
514
515
516
517
518
519
520
521
522
523
524
525
526
527
528
529
530
531
532
533
534
535
536
537
538
539
540
541
542
543
544
545
546
547
548
549
550
551
552
553
554
555
556
557
558
559
560
561
562
563
564
565
566
567
568
569
570
571
572
<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8" />
<title>Concordion - FAQ</title>
<link media="all" rel="stylesheet" type="text/css" href="css/default.css"/>
<link media="print" rel="stylesheet" type="text/css" href="css/print.css"/>
<link rel="icon" type="image/vnd.microsoft.icon" href="favicon.ico" />
<style>
table {
border-collapse: collapse;
empty-cells: show;
margin: 8px 0px 8px 0px;
}
th, td {
border: 1px solid black;
padding: 3px;
}
td {
background-color: white;
vertical-align: top;
}
th {
background-color: #d5dae8;
}
th.vertical {
vertical-align: top;
text-align: left;
}
h3 {
padding-top: 20px;
}
.aside {
padding: 3px 10px 3px 10px;
font-size: 8pt;
border-left: 1px solid #444;
background-color: #f0f0f0;
color: #444;
line-height: 140%;
}
</style>
</head>
<body>
<div class="page">
<div class="header">
<div id="google_translate_element" class="language-translation"></div>
<div class="logo"><a href="index.html"> <img src="image/front-page-banner.png" alt="Specification by Example" /> </a></div>
</div><!-- header -->
<div class="menuBar">
<ul class="menu">
<li><a href="/">Home</a></li>
<li><a href="Example.html">Example</a></li>
<li><a href="Tutorial.html">Tutorial</a></li>
<li><a href="Technique.html">Hints and Tips</a></li>
<li><a href="ExtensionsAPI.html">Extensions API</a></li>
<li><a href="Extensions.html">Extensions</a></li>
<li><a href="Download.html">Download</a></li>
<li class="selectedTab"><a href="Questions.html">FAQ</a></li>
</ul>
</div><!-- menuBar -->
<div class="content">
<h1>FAQ</h1>
<ul>
<li><a href="#whoDevelopedIt">Who developed Concordion?</a></li>
<li><a href="#licensing">How is Concordion licensed?</a></li>
<li><a href="#mailingList">Is there a mailing list?</a></li>
<li><a href="#twitter">Is there a twitter account?</a></li>
<li><a href="#issueList">How do I report defects or submit enhancement requests?</a></li>
<li><a href="#sourceCode">Where is the source code repository?</a></li>
<li><a href="#collaborate">How do I collaborate with development of Concordion?</a></li>
<li><a href="#articles">Are there any good articles on Concordion?</a></li>
<li><a href="#presentingOutput">How do I fashion the test output into a presentable form?</a></li>
<li><a href="#comparisonWithFit">How does Concordion differ from the Fit Framework and FitNesse?</a></li>
<li><a href="#comparisonWithSelenium">How does Concordion differ from Selenium?</a></li>
<li><a href="#scriptVsSpecify">What is the difference between scripting and specifying?</a></li>
<li><a href="#groovyJRuby">Why not use Groovy, JRuby or some other scripting language in</a></li>
<li><a href="#htmlClumsy">Isn't HTML a bit clumsy?</a></li>
<li><a href="#whyNotWiki">Why not use a wiki or Word documents instead?</a></li>
<li><a href="#toolSupport">Are there any tools to help me edit Concordion specifications?</a></li>
<li><a href="#extension">Can I extend Concordion with my own commands?</a></li>
<li><a href="#storyDrivenProcess">Can you outline a story-driven process with Concordion?</a></li>
<li><a href="#untestable">What can't Concordion test?</a></li>
<li><a href="#miniWaterfall">Is your recommended process like a series of mini waterfalls?</a></li>
<li><a href="#jenkins">How do I publish Concordion output on Jenkins?</a></li>
<li><a href="#complexExpressions">How do I use complex expressions in my Concordion specifications?</a></li>
<li><a href="#ownDogFood">Does Concordion itself have active specifications?</a></li>
</ul>
<div class="memo" style="padding-top: 0px">
<a name="whoDevelopedIt"> </a>
<h3>Who developed Concordion?</h3>
<p>
Concordion was originally developed by <a class="externalLink" href="http://www.davidpeterson.co.uk">David Peterson</a>,
an agile consultant based in London, UK. The idea was sparked by conversations with testers and developers, in particular
<a class="externalLink" href="http://www.natpryce.com/">Nat Pryce</a> and
<a class="externalLink" href="http://www.higherorderlogic.com/">Steve Freeman</a>,
while working at Easynet (BSkyB) in 2006. Concordion has been ported and further extended by several other
developers - particularly Nigel Charman (based in New Zealand) who designed the Concordion Extensions API.
</p>
<p>
Please use the
<a class="externalLink" href="http://groups.google.com/d/forum/concordion">mailing list</a> for questions about Concordion.
</p>
<a name="licensing"> </a>
<h3>How is Concordion licensed?</h3>
<p>
Concordion is licensed under the Apache License, v2.0.
See <a href="Licence.html">here</a> for the license text.
</p>
<a name="mailingList"> </a>
<h3>Is there a mailing list?</h3>
<p>
Yes, on Google Groups. <a class="externalLink" href="http://groups.google.com/d/forum/concordion">Join here</a>.
We also have a <a class="externalLink" href="http://groups.google.com/d/forum/concordion-dev">developer list</a>
for discussing development of Concordion core and extension code.
</p>
<a name="twitter"> </a>
<h3>Is there a twitter account?</h3>
<p>
Yes!
</p>
<p>
<a class="twitter-timeline" height="250px" data-chrome="nofooter" href="https://twitter.com/concordion" data-widget-id="526560172584341504">Tweets by @concordion</a>
<script>!function(d,s,id){var js,fjs=d.getElementsByTagName(s)[0],p=/^http:/.test(d.location)?'http':'https';if(!d.getElementById(id)){js=d.createElement(s);js.id=id;js.src=p+"://platform.twitter.com/widgets.js";fjs.parentNode.insertBefore(js,fjs);}}(document,"script","twitter-wjs");</script>
</p>
<a name="issueList"> </a>
<h3>How do I report defects or submit enhancement requests?</h3>
<p>
In Concordion's <a class="externalLink" href="https://github.com/concordion/concordion/issues"> Issues List</a>.
</p>
<a name="sourceCode"> </a>
<h3>Where is the source code repository?</h3>
<p>
It is hosted on GitHub: <a class="externalLink" href="https://github.com/concordion/concordion">Main Project Page</a>,
<a class="externalLink" href="https://github.com/concordion">all sub-projects</a>. The current
development version (potentially unstable) can be cloned as follows:
</p>
<pre>git clone https://github.com/concordion/concordion.git
</pre>
<a name="collaborate"> </a>
<h3>How do I collaborate with development of Concordion?</h3>
<p>
Firstly, you should <a href="#issueList">create an issue</a> for your enhancement request.
</p>
<p>
Concordion uses a "Fork & Pull" model for collaborative development. If you have changes that you would like us to consider for introduction to Concordion,
you will need to <a href="https://help.github.com/articles/fork-a-repo">fork</a> the repository, commit and push your changes to your forked project, and send us a <a href="https://help.github.com/articles/using-pull-requests">pull request</a> referencing the URL of the issue that you created.
</p>
<p>
Please note that, in order to keep Concordion clean and minimal, we consider all enhancement requests carefully. Should your enhancement not be appropriate for Concordion core, you may wish to package it as a Concordion <a href="ExtensionsAPI.html">extension</a>.
</p>
<p>
See README-DEVELOPERS.txt in the concordion repository for the development standards.
</p>
<h3 id="articles">Are there any good articles on Concordion?</h3>
<ul>
<li><a href="memo/MethodsAndTools-Concordion.pdf">
Concordion tutorial / review
</a>
<br />— Tomo Popovic, Methods and Tools, Summer 2012
</li>
<li><a class="externalLink" href="http://blog.shinetech.com/2014/05/09/concordion-integration-with-jenkins/">
Concordion Integration with Jenkins
</a>
<br />— Jack Low, May 2014
</li>
<li><a class="externalLink" href="http://maxheapsize.com/2009/10/13/concordion-vs-cucumber-and-java-based-acceptance-testing/">
Concordion vs. Cucumber and Java Based Acceptance Testing
</a>
<br />— Oliver Wehrens, October 2009
</li>
<li><a class="externalLink" href="http://gojko.net/2008/08/25/concordion-agile-acceptance-testing-with-free-form-text/">
Concordion: Agile Acceptance Testing with free-form text
</a>
<br />— Gojko Adzic, August 2008
</ul>
<a name="presentingOutput"> </a>
<h3>How do I fashion the test output into a presentable form?</h3>
<p>
By default, the output of Concordion goes to the temp directory, but
you can change the location with the JVM variable "<code>concordion.output.dir</code>".
</p>
<p>
If you run all your tests then you'll get a complete set of coloured
output HTML files, which you can publish on a web-server or whatever.
To allow navigation, use the
<a href="http://www.concordion.org/dist/1.5.1/spec/concordion/results/breadcrumbs/Breadcrumbs.html">breadcrumbs</a>
naming convention and add <code><a href="..."></code> links between related specs.
</p>
<p>
See the <a target="specs" href="dist/1.5.1/spec/concordion/command/assertEquals/AssertEquals.html">Concordion specs</a> for an example.
</p>
<p>
If you want to use custom CSS or JavaScript, or include images or other resources, in your Concordion output, you will need to write a <a href="ExtensionsAPI.html#cssExample">simple extension</a>.
</p>
<a name="comparisonWithFit"> </a>
<h3>How does Concordion differ from the Fit Framework and FitNesse?</h3>
<p>
The Fit Framework was the inspiration for Concordion. I used it for a
couple of years before I decided to develop Concordion with the following
aims:
</p>
<ul>
<li>Improved readability of documents</li>
<li>More "opinionated" (scripting is actively discouraged)</li>
<li>Easier to use</li>
</ul>
<p>
What I've tried to do in Concordion is place a stronger emphasis on writing
specifications of requirements, rather than test scripts. When you
use Concordion, the scripting needed to test the requirement is
hidden in the fixture code. I've explained this <a href="Technique.html">elsewhere</a>
but basically the reason you want to make a distinction is that it
means you can change the implementation and know that you are still
meeting the requirement. Test scripts mix up the requirement with
implementation details.
</p>
<p>
(See "<a href="ScriptingMakeover.html">Scripting Makeover</a>"
for a typical example of a FitNesse acceptance test and my take at
a Concordion equivalent specification.)
</p>
<p>
You can write active specifications with Fit, but it doesn't
make it easy for you. Because of the way Fit uses inheritance, its
fixture code is cumbersome, so developers tend to write as few fixtures
as possible. This leads to generic fixtures that can be used in
multiple specifications. Though this sounds like a good thing, it usually
means that the examples in the specifications are copy-and-paste jobs
and not well-focused.
Irrelevant detail causes all the problems associated with duplication
as well as making the examples harder to follow.
In addition, having generic fixtures tends to lead to scripting.
</p>
<p>
With Concordion the fixture code is much simpler and every specification
has its own unique fixture. Because you're not sharing fixtures, it
encourages you to focus the examples in the specifications much more
carefully. To remove duplication across fixtures, you build a simple
scripting API that the fixtures call into.
</p>
</div>
<table>
<tr>
<th width="20%" class="vertical"></th>
<th width="40%">Fit Framework</th>
<th width="40%">Concordion</th>
</tr>
<tr>
<th class="vertical">Mapping document contents to Java code</th>
<td>Heading rows in tables form implicit mappings.
<p>Pros:</p>
<ul>
<li>Can work with HTML or with Excel spreadsheets.</li>
</ul>
<p>Cons:</p>
<ul>
<li>Fixture code is verbose.</li>
<li>It can be hard to see which table maps to which class / method.</li>
<li>Examples can only be in tables.</li>
<li>Document authors need to be aware of the way Fit processes the document.</li>
</ul>
</td>
<td>
Explicit (but hidden) instrumentation in the
document performs the mapping.
<p>Pros:</p>
<ul>
<li>Fixture code is clean and simple.</li>
<li>Obvious what is called and when.</li>
<li>Any HTML can be instrumented - paragraphs, lists, tables etc.</li>
<li>Authors can focus on making documents readable
without having to worry about how they are going
to be processed.</li>
</ul>
<p>Cons:</p>
<ul>
<li>Requires an HTML source document.</li>
</ul>
</td>
</tr>
<tr>
<th class="vertical">Storage of specifications</th>
<td>Fit: File system<br />Fitnesse: Wiki</td>
<td>In a Java source folder (I usually have folders "src", "test" and "spec").
The advantage is that the specification and its corresponding
fixture are always together, and can be stored under version
control with the rest of the code.
</td>
</tr>
<tr>
<th class="vertical">Integration</th>
<td>Separate runner</td>
<td>Run using JUnit</td>
</tr>
<tr>
<th class="vertical">Platforms</th>
<td>Java, .NET, Python, Ruby, perl, Smalltalk, C++</td>
<td>Java, .NET, Python, Ruby, Scala, Fantom (see <a href="Ports.html">Ports</a>)</td>
</tr>
<tr>
<th class="vertical">Time to Learn</th>
<td>I don't know. It took me several weeks and the book to really understand it!</td>
<td>About 30 mins</td>
</tr>
</table>
<div class="memo">
<a name="comparisonWithSelenium"> </a>
<h3>How does Concordion differ from Selenium?</h3>
<p>
<a class="externalLink" href="http://docs.seleniumhq.org/">Selenium</a>
is a test scripting tool for driving web browsers.
Concordion is a specification tool and hides scripting activity inside
Java fixture code. For tests that exercise the browser, we recommend
<a class="externalLink" href="http://docs.seleniumhq.org/projects/webdriver/">Selenium WebDriver</a>
with Concordion.
</p>
<p>
The <a class="externalLink" href="https://github.com/concordion/concordion-screenshot-extension-demo"/>screenshot extension demo</a>
project demonstrates Concordion working with Selenium WebDriver.
</p>
<a name="scriptVsSpecify"> </a>
<h3>What is the difference between scripting and specifying?</h3>
<p>
See <a href="Technique.html">here</a> for an explanation.
</p>
<a name="groovyJRuby"> </a>
<h3>Why not use Groovy, JRuby or some other scripting language in
the instrumentation?</h3>
<p>
Experience from trial and error.
</p>
<p>The first prototype of Concordion did indeed use Groovy in the
instrumentation. With that kind of power available I found that I
couldn't help putting scripting into the instrumentation. At first
this was fine, but after a while I found that I was frequently having
to change the instrumentation during refactoring. The IDE didn't
give much assistance and I realised what I was doing was a mistake.
</p>
<p>
The place for scripting is in the Java fixture code, not in the
instrumentation. Once this realisation dawned on me, having a
powerful expression language in the instrumentation was pointless,
at best, and dangerously misleading, at worst, so I worked to cut
the language down to a bare minimum. The only thing the
instrumentation needs to do is call methods on the fixture.
All the scripting logic should be in the fixture.
</p>
<p>
This separation of concerns means that the HTML files rarely change
and you have the full power of Java for scripting and removing
duplication. It also means that you can hook the specification in
at any level you like from unit to system level without having to
change the instrumentation. For example, you might gradually move
your tests from testing through the UI to testing the domain layer
directly as it emerges.
</p>
<a name="htmlClumsy"> </a>
<h3>Isn't HTML a bit clumsy?</h3>
<p>
Yes, it is a bit, but not nearly as much as you might think. Once you have
a page template (there's one in the tutorial) you just have to fill in the
wording. You don't have to use many tags; <p>, <span>, <table>,
<tr>, <th>, and <td> are probably all you need. Improved
IDE tool support is on my to-do list, however.
</p>
<p>
Concordion works well where authorship of the documents is a collaborative
effort (developer + tester + analyst) rather than something that analysts
or testers do on their own. If you produce the specifications as a group
there'll usually be someone who's comfortable writing HTML. If not, it's not
particularly difficult to learn.
</p>
<p>
The <a href="ExtensionsAPI.html">Extensions API</a> allows you to define alternative input sources.
For example, the <a class="externalLink" href="https://github.com/concordion/concordion-excel-extension">Excel extension</a>.
If you implement an additional input source, feel free to contribute it as an extension.
</p>
<a name="whyNotWiki"> </a>
<h3>Why not use a wiki or Word documents instead?</h3>
<p>
I shied away from a Wiki because it involves much more set-up and maintenance.
Wikis also tend to have poor version control.
</p>
<p>
The advantage of HTML over Word docs is that it's easier to link between
pages and it's a more open format.
</p>
<a name="toolSupport"> </a>
<h3>Are there any tools to help me edit Concordion specifications?</h3>
<p>
The <a href="https://plugins.jetbrains.com/plugin/7978?pr=idea">Concordion Support</a> plugin for IntelliJ IDEA, developed and maintained by <a href="https://github.com/gmandnepr">Ievgen Degtiarenko</a>,
provides excellent support for Concordion in IntelliJ IDEA.
</p>
<p>
The <a href="http://code.google.com/p/concordion-eclipse/">Concordion Eclipse Plugin</a>, developed and maintained by <a href="http://devnotesblog.wordpress.com/">matf</a>,
provides content assist and validation for Concordion Specs in Eclipse.
</p>
<a name="extension"> </a>
<h3>Can I extend Concordion with my own commands?</h3>
<p>
Yes. See <a target="specs" href="ExtensionsAPI.html">here</a> for details.
</p>
<a name="storyDrivenProcess"> </a>
<h3>Can you outline a story-driven process with Concordion?</h3>
<p>
<img style="padding: 10px 0px 28px 0px;" src="image/faq/StoryDeliveryLifecycle.png"
alt="Story Delivery Lifecycle (diagram)"/>
</p>
<p>
This process has worked well for me.
Writing specifications removes ambiguity so that when the product
owner decides, "OK, that's good enough for this iteration", there's
agreement about exactly what "done" means.
</p>
<p>
Locking down the scope gives stability. If you didn't think of something
during the initial discussion it can probably wait until the next
iteration. If not, you can agree as a team to add it, but behaviour
can't just be "slipped in" casually.
</p>
<p>
<a class="pdfLink" href="memo/StoryDeliveryLifecycle.pdf">PDF version of diagram</a>
</p>
<a name="untestable"> </a>
<h3>What can't Concordion test?</h3>
<p>
Lots of things (e.g. how pretty a user interface is). However, as
a rule of thumb, if you can test it with JUnit then you can test it
with Concordion.
</p>
<a name="miniWaterfall"> </a>
<h3>Is your recommended process like a series of mini waterfalls?</h3>
<p>
No. It's acceptance test-driven development (ATDD).
The concrete examples in active specifications are acceptance
tests. The idea is that you write them before you write the code.
</p>
<p>
The <a class="externalLink" href="http://agilemanifesto.org/">Agile Manifesto</a>
says there is "value in the items on the right" but they "value the items on the left more".
Concordion helps you to support and boost the items on the left
by extracting the value from the items on the right
without succumbing to their downsides.
</p>
<a name="jenkins"> </a>
<h3>How do I publish Concordion output on Jenkins?</h3>
<p>
The <a class="externalLink" href="https://wiki.jenkins-ci.org/display/JENKINS/HTML+Publisher+Plugin">HTML Publisher plugin</a> can publish the
Concordion results, maintain a per-build history, and let you download the output as a zip file.
</p>
<p>
This <a class="externalLink" href="http://blog.shinetech.com/2014/05/09/concordion-integration-with-jenkins/">Concordion Integration with Jenkins</a> article describes how to integrate Concordion, WebDriver, the Concordion Screenshot Extension and Jenkins.
</p>
<p>NOTE: as of Jenkins 1.641 / 1.625.3, the new <a href="https://wiki.jenkins-ci.org/display/JENKINS/Configuring+Content+Security+Policy">Content Security Policy</a> results in Concordion reports being no longer viewable in Jenkins, with the error <code>"Refused to apply inline style because it violates the following Content Security Policy directive: "style-src 'self'"</code>. Concordion reports use inline CSS and Javascript.
</p>
<p>While we investigate the issue further, the only workaround is to restore the security vulnerability. To do this, relax the policy to allow <code>script-src 'unsafe-inline'</code> and <code>style-src 'unsafe-inline'</code> by appending <code>-Dhudson.model.DirectoryBrowserSupport.CSP=\" sandbox; default-src 'none'; img-src 'self' 'unsafe-inline'; style-src 'self' 'unsafe-inline'; script-src 'unsafe-inline';\"</code> to the value of the JAVA_ARGS variable in the Jenkins startup script (/etc/default/jenkins on Linux) and restarting Jenkins. Note that we are still investigating this further - see the <a class="externalLink" href="https://groups.google.com/d/msg/concordion/RSp92D2CNuc/nwYW4yqvEQAJ">discussion</a>.</p>
<a name="complexExpressions"> </a>
<h3>How do I use complex expressions in my Concordion specifications?</h3>
<p>
In order to <a href="Technique.html#keepSpecsSimple">keep your specifications simple</a> and maintainable, Concordion deliberately restricts the expression format that is allowed when instrumenting specifications. Complexity should be moved into the fixture code, and then <a href="Technique.html#evolveDSL">evolved into a DSL</a>, where it is easier to maintain. The idea is to have the fixture do all the work of fetching and munging the data and then return exactly the data that the spec needs, which helps to decouple the spec from the implementation.
</p>
<p>
However, if you really want to remove this restriction you can apply the annotation @FullOGNL to your fixture class. This would allow you to do things like <a class="externalLink" href="http://stackoverflow.com/questions/23658633/use-result-object-of-first-concordion-call-as-arg-in-secound-concordion-call">pass property values of Java beans into methods<a>, or <a class="externalLink" href="http://stackoverflow.com/questions/19681470/sending-a-constant-parameter-to-concoridion-execute-call">use constant values in concordion:execute commands</a>.
</p>
<a name="ownDogFood"> </a>
<h3>Does Concordion itself have active specifications?</h3>
<p>
Yes, it has <a target="specs" href="dist/1.5.1/spec/concordion/Concordion.html">quite a few</a>.
Obviously to begin with I didn't have the tool, so there are a lot of gaps!
</p>
</div> <!-- memo -->
</div> <!-- content -->
</div> <!-- page -->
<div class="copyright">
<a rel="license" href="http://creativecommons.org/licenses/by/4.0/"><img alt="Creative Commons License" style="border-width:0" src="https://i.creativecommons.org/l/by/4.0/88x31.png" /></a><br />This work is licensed under a <a rel="license" href="http://creativecommons.org/licenses/by/4.0/">Creative Commons Attribution 4.0 International License</a>.
</div> <!-- copyright -->
<script>
(function(i,s,o,g,r,a,m){i['GoogleAnalyticsObject']=r;i[r]=i[r]||function(){
(i[r].q=i[r].q||[]).push(arguments)},i[r].l=1*new Date();a=s.createElement(o),
m=s.getElementsByTagName(o)[0];a.async=1;a.src=g;m.parentNode.insertBefore(a,m)
})(window,document,'script','//www.google-analytics.com/analytics.js','ga');
ga('create', 'UA-58172036-1', 'auto');
ga('send', 'pageview');
</script>
<script type="text/javascript">
function googleTranslateElementInit() {
new google.translate.TranslateElement({pageLanguage: 'en', layout: google.translate.TranslateElement.InlineLayout.SIMPLE, gaTrack: true, gaId: 'UA-58172036-1'}, 'google_translate_element');
}
</script>
<script type="text/javascript" src="//translate.google.com/translate_a/element.js?cb=googleTranslateElementInit"></script>
</body>
</html>